Zap logger adds UUID to all logs in golang

PHPz
Release: 2024-02-14 19:24:09
forward
1176 people have browsed it

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()
}
Copy after login

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))
}
Copy after login

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...)
}
Copy after login

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"}
Copy after login

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!

source:stackoverflow.com
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!