IMO, there really isn't a super good answer. The simple answer is: You need
to delay the actual `fmt.Sprintf` call as long as possible. Which generally
means, that the interface you consume (to allow the user to direct and
configure logging) will need to reflect formatting and all kinds of things
that the user actually doesn't want to deal with. So it's hard to find a
good tradeoff between API simplicity and usability and not allocating in
this case.

Another, maybe unforseen problem, is that you don't want logging to
interfere with production. It's a painful lesson to learn, that synchronous
logging can take down a production service with ease. If you want to be
prepared for that and reduce the runtime overhead of logging, you will have
to make it asynchronous. But that's fundamentally at odds with the above
goal of delaying formatting - the user will usually not expect arguments to
loggers to be used after the logging call returns. Buffering a formatted
string avoids that of course.

Lastly, if you want runtime-configurability of logging and conditionally
discard messages, you will likely reach for interfaces and thus limit the
usefulness of escape analysis and inlining. So, by trying to allocate less,
you might end up allocating more, because the compiler has to put things on
the heap to be safe.

FWIW, I've blogged about this
<https://blog.merovius.de/2017/08/06/what-i-want-from-a-logging-api.html> a
couple of years ago. The opinions expressed there are probably
controversial (and I haven't looked at it in a while - I might not even
agree with them myself anymore), but it might help open up even more
questions or give you some ideas. Also, there are of course many, many
logging APIs already existing and I'm sure the people who wrote and use
them will have strong opinions about those as well :) Personally, I've kind
of given up on the idea of a panacea log API.

On Mon, Mar 9, 2020 at 4:27 PM Vasiliy Tolstov <v.tols...@selfip.ru> wrote:

> Hi! I have some logging package and after memory profiling saw that for
> disabled log levels i'm allocate memory for message.
> For example i'm send in logger only Info level. So i want to avoid
> Debug/Trace stuff.
> but memory profiling says that for call log.Tracef("my message %v", msg)
> i'm allocate memory.
> I don't want to guard all calls to check enabled log level to
> avoid allocation. How can i do zero allocation log in such case?
> Thanks!
>
> --
> Vasiliy Tolstov,
> e-mail: v.tols...@selfip.ru
>
> --
> You received this message because you are subscribed to the Google Groups
> "golang-nuts" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to golang-nuts+unsubscr...@googlegroups.com.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/golang-nuts/CACaajQswqK3DGHESCFd4pCdxndFpOFyKXhO25UDKgEsxYeK3SA%40mail.gmail.com
> <https://groups.google.com/d/msgid/golang-nuts/CACaajQswqK3DGHESCFd4pCdxndFpOFyKXhO25UDKgEsxYeK3SA%40mail.gmail.com?utm_medium=email&utm_source=footer>
> .
>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/CAEkBMfF6kRp0V4LUGxfu3qDu4K7mpz%3DdhA76EU_qd1DfveZk-Q%40mail.gmail.com.

Reply via email to