log.With isn’t the only trick available for improving performance of logging.
Many values you may want to pass to a logger need to be calculated. And sometimes that calculation is expensive. And if a log is omitted, because it’s a debug log, and our logger is only configured for info-and-up level, that calculation should be skipped.
Performance considerations
…
The arguments to a log call are always evaluated, even if the log event is discarded. If possible, defer computation so that it happens only if the value is actually logged. For example, consider the call
slog.Info("starting request", "url", r.URL.String()) // may compute String unnecessarilyThe URL.String method will be called even if the logger discards Info-level events. Instead, pass the URL directly:
slog.Info("starting request", "url", &r.URL) // calls URL.String only if needed
This trick—passing a fmt.Stringer rather than a literal string—is a good example of the principal of deferring calculation, but it’s not the best example in practice. As the documentation goes on to explain:
The built-in TextHandler will call its String method, but only if the log event is enabled.
But notice: the fmt.Stringer trick depends on which log handler backend you’re using, and whether or not it handles fmt.Stringer values specially.
For JSONHandler or many third-party handlers, this specific trick won’t work. But stay tuned for that one weird trick for all your loggers!