op / go-logging

Golang logging library
BSD 3-Clause "New" or "Revised" License
1.79k stars 272 forks source link

Log using UTC time #98

Open clawconduce opened 8 years ago

clawconduce commented 8 years ago

I have a simple logger setup:

import logging "github.com/op/go-logging"

func main() {
    ...

    log := logging.MustGetLogger(name)

    // Setup the logger
    logBackend := logging.NewLogBackend(os.Stdout, "", 0)
    var format = logging.MustStringFormatter(
        `%{time:2006-01-02 15:04:05.000} : %{level:-6.6s} : %{message}`,
    )
    logging.timeNow = timeNow
    logBackendFormatter := logging.NewBackendFormatter(logBackend, format)
    logging.SetBackend(logBackendFormatter)
}

and I am trying to get it to output timestamps in UTC time, but I do not see a way to do this. I think setting logging.timeNow would work, but this isn't possible because it is not exported. Is there a way to do this? If not, could we support using custom time functions? I'd like to use something like:

func UtcTimeNow() time.Time {
    return time.Now().UTC()
}

Thanks!

talee commented 7 years ago

Haven't tried it out, but NewLogBackend(out io.Writer, prefix string, flag int) proxies the flag variable to the standard log library's log.New. The flags supported include UTC time: https://golang.org/pkg/log/#pkg-constants

const (
        // Bits or'ed together to control what's printed.
        // There is no control over the order they appear (the order listed
        // here) or the format they present (as described in the comments).
        // The prefix is followed by a colon only when Llongfile or Lshortfile
        // is specified.
        // For example, flags Ldate | Ltime (or LstdFlags) produce,
        //  2009/01/23 01:23:23 message
        // while flags Ldate | Ltime | Lmicroseconds | Llongfile produce,
        //  2009/01/23 01:23:23.123123 /a/b/c/d.go:23: message
        Ldate         = 1 << iota     // the date in the local time zone: 2009/01/23
        Ltime                         // the time in the local time zone: 01:23:23
        Lmicroseconds                 // microsecond resolution: 01:23:23.123123.  assumes Ltime.
        Llongfile                     // full file name and line number: /a/b/c/d.go:23
        Lshortfile                    // final file name element and line number: d.go:23. overrides Llongfile
        LUTC                          // if Ldate or Ltime is set, use UTC rather than the local time zone
        LstdFlags     = Ldate | Ltime // initial values for the standard logger
)
khoffrath commented 7 years ago

@talee LUTC isn't taken into account when the package generates the timestamp. @clawconduce Please see the referenced pull request to export timeNow.

clawconduce commented 7 years ago

That looks good to me, if it's merged I believe this ticket should get closed

HarshalVoonna commented 4 years ago
var format = logging.MustStringFormatter(
    `%{shortfile} ▶ %{level:.4s} %{message}`,
)

backend1 := logging.NewBackendFormatter(
    logging.NewLogBackend(&lumberjack.Logger{
        Filename:   "foo-ERROR.log",
        MaxSize:    1, // megabytes
        MaxBackups: 3,
        MaxAge:     1,    // days
        Compress:   true, // disabled by default
    }, "", log.LstdFlags|log.LUTC), format)

this worked for me.