Home  >  Article  >  Backend Development  >  Zap logger adds UUID to all logs in golang

Zap logger adds UUID to all logs in golang

PHPz
PHPzforward
2024-02-14 19:24:091117browse

Zap logger 将 UUID 添加到 golang 中的所有日志中

php editor Xigua introduced: In golang, logging is an integral part of the development process. Zap logger is a very popular logging library that provides rich functions and high performance. Recently, a new feature has been added to Zap logger, which is to add UUID to all logs. The purpose of this function is to better track logs and facilitate developers to track problems in distributed systems. With this new feature, developers can more accurately locate problems and improve debugging efficiency. This is a very practical feature for engineers who develop using golang.

Question content

I used this method in lambda:

import (
    "os"

    "go.uber.org/zap"
    "go.uber.org/zap/zapcore"
)

func initlogger() *zap.logger {
    config := zap.newproductionencoderconfig()
    config.encodetime = zapcore.rfc3339timeencoder
    consoleencoder := zapcore.newjsonencoder(config)
    core := zapcore.newtee(zapcore.newcore(consoleencoder, zapcore.addsync(os.stdout), zapcore.infolevel))
    return zap.new(core).with()
}

In my lambda handler I have:

var (
    log *zap.Logger
)

func init() {
    log = u.InitLogger()
}

func handler(r events.APIGatewayProxyRequest) (*events.APIGatewayProxyResponse, error) {

    out, err := exec.Command("uuidgen").Output()
    uuid := strings.ReplaceAll(string(out), "\n", "")
    if err != nil {
        log.Error(err.Error())
    }

    log.Info("PRINT_1", zap.Any("uuid", uuid), zap.Any("Request", r.Body))
}

I have a question, is it possible to add uuid to all logs without adding them one by one? Because in every log where I need to print something, I need to add zap.any("uuid", uuid)

The problem is that I need to pass the uuid as parameter to all methods to print it in log message or error.

Workaround

You will have to rearrange your code a bit since you are just creating the uuid in the handler which means it is request specific while the logger is global of...

However, the point for this library is that you have to create a sublogger (in fact, you're already doing this: you just pass the fields there). Any subsequent logs written to the sublogger will contain these fields.

For example:

func main() {
    logger := initlogger(zap.string("foo", "bar"))
    logger.info("first message with our `foo` key")
    logger.info("second message with our `foo` key")
}

func initlogger(fields ...zap.field) *zap.logger {
    config := zap.newproductionencoderconfig()
    config.encodetime = zapcore.rfc3339timeencoder
    consoleencoder := zapcore.newjsonencoder(config)
    core := zapcore.newtee(zapcore.newcore(consoleencoder, zapcore.addsync(os.stdout), zapcore.infolevel))
    return zap.new(core).with(fields...)
}

Output:

{"level":"info","ts":"2022-11-24T18:30:45+01:00","msg":"First message with our `foo` key","foo":"bar"}
{"level":"info","ts":"2022-11-24T18:30:45+01:00","msg":"Second message with our `foo` key","foo":"bar"}

The above is the detailed content of Zap logger adds UUID to all logs in golang. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:stackoverflow.com. If there is any infringement, please contact admin@php.cn delete