rs / zerolog

Zero Allocation JSON Logger
MIT License
10.41k stars 567 forks source link

How to set timezone when using ConsoleWriter? #521

Open chuan137 opened 1 year ago

chuan137 commented 1 year ago

I tried to set the TimestampFunc, and it does change the json output, but not working on the console writer

    zerolog.TimestampFunc = func() time.Time {
        return time.Now().UTC()
    }

and here is my logs looks like, they are printed from same run with different logger. The timestamp jumps by 1hr because I am in the +1 timezone. The timestamp in json is correct UTC time, but the console writer logs the local time. How can I make it also log the UTC time?

{"level":"info","time":"2023-02-10T23:03:52Z","message":"config and template dir: ./"}
{"level":"info","time":"2023-02-10T23:03:52Z","message":"observe metrics from http://localhost:9090"}
2023-02-11T00:03:52+01:00 DBG pkg/netappsd/queue.go:67 > queue readiness = false
luxinxinxin commented 1 year ago

you can change /etc/localtime in the system directory.

ramitmittal commented 1 year ago

You can use a custom formatter for timestamps with ConsoleWriter.

cw := zerolog.NewConsoleWriter(func(w *zerolog.ConsoleWriter) {
    w.FormatTimestamp = func(i interface{}) string {
        if v, ok := i.(string); ok {
            if ts, err := time.ParseInLocation(time.RFC3339, v, time.Local); err == nil {
                return ts.UTC().Format(time.RFC3339)
            }
        }
        return "<nil>"
    }
})
log.Logger = log.Output(cw)

This was adapted from consoleDefaultFormatTimestamp in console.go. Link. Use that as a reference and make modifications wherever required. I have assumed that you're using ConsoleWriter only in development.