Sometimes instead of creating a logger and then passing it around, it is convenient to just use a
global logger.
The standard log library allows you to both create a custom logger using
log.New() or directly use a standard logger instance by calling
the package helper functions log.Printf() and the like.
zap provides such a functionality as well using zap.L() and zap.S(), however using them
didn’t seem so straight forward to me.
The various implementations of field encoders provided in zap can sometimes feel inadequate. For
example, you might want the logging output to be similar to that in syslog or other common log
formats. You might want the timestamps in the log to ignore seconds, or the log level to be wrapped
within square brackets.
To have your own custom formatters for the metadata fields you need to write custom encoders.
Using the logger presets in zap can be a huge time saver, but if you really need to tweak the
logger, you need to explore ways to create custom loggers. zap provides an easy way to create
custom loggers using a configuration struct. You can either create the logger configuration using a
JSON object (possibly kept in a file next to your other app config files), or you can statically
configure it using the native zap.Config struct, which we will explore here.
I was intrigued when Uber announced zap, a logging library for Go with claims of really high
speed and memory efficiency. I had tried structured
logging earlier using logrus, but while I did not experience
it myself, I was worried by a lot of folks telling me about its performance issues at high log
volumes. So when zap claimed performance exceeding the log package from standard library, I had
to try it. Also, its flexible framework left the door open to a future plan of mine of sending logs
filebeat style to ELK.
The documentation for the library was pretty standard, but I
could not find a reasonable introduction to explore the various ways one can use the library. So I
decided to document some of my experiments with the library.
I collected my code examples in Github, and decided to
break it up into a series of posts.
Curious about several peculiar Apple related 404 errors for images in my web
server logs, I decided to find what is going on, and became knowledgeable about
yet another nugget that I really didn’t want to know. (sigh)