]> Cypherpunks repositories - gostls13.git/commitdiff
log: add flag LUTC, to use UTC time zone for time stamp
authorRob Pike <r@golang.org>
Fri, 10 Apr 2015 20:33:03 +0000 (13:33 -0700)
committerRob Pike <r@golang.org>
Sat, 11 Apr 2015 02:30:24 +0000 (02:30 +0000)
Issue 9483 suggests several approaches to correlating logs from
machines in different time zones. This approach is the simplest and
really should be sufficient: provide a way to clamp the time stamps
to UTC.

Fixes #9483.

Change-Id: If540b991d758c4d845a719779f8255ece7c452e7
Reviewed-on: https://go-review.googlesource.com/8761
Reviewed-by: Ian Lance Taylor <iant@golang.org>
src/log/log.go
src/log/log_test.go

index 9b6800891c7d5f8afb1c672bf28426283541dab7..4cfe5503006d65de3abc779ce3ac057f90def012 100644 (file)
@@ -32,11 +32,12 @@ const (
        //      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: 2009/01/23
-       Ltime                         // the time: 01:23:23
+       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
 )
 
@@ -88,6 +89,9 @@ func itoa(buf *[]byte, i int, wid int) {
 
 func (l *Logger) formatHeader(buf *[]byte, t time.Time, file string, line int) {
        *buf = append(*buf, l.prefix...)
+       if l.flag&LUTC != 0 {
+               t = t.UTC()
+       }
        if l.flag&(Ldate|Ltime|Lmicroseconds) != 0 {
                if l.flag&Ldate != 0 {
                        year, month, day := t.Date()
index d7d24900629800890c379daad68c4e9cf59b5d88..709de1e542ec1afdbfa5fea3bf76fdfe869166e5 100644 (file)
@@ -8,17 +8,19 @@ package log
 
 import (
        "bytes"
+       "fmt"
        "os"
        "regexp"
        "strings"
        "testing"
+       "time"
 )
 
 const (
        Rdate         = `[0-9][0-9][0-9][0-9]/[0-9][0-9]/[0-9][0-9]`
        Rtime         = `[0-9][0-9]:[0-9][0-9]:[0-9][0-9]`
        Rmicroseconds = `\.[0-9][0-9][0-9][0-9][0-9][0-9]`
-       Rline         = `(55|57):` // must update if the calls to l.Printf / l.Print below move
+       Rline         = `(57|59):` // must update if the calls to l.Printf / l.Print below move
        Rlongfile     = `.*/[A-Za-z0-9_\-]+\.go:` + Rline
        Rshortfile    = `[A-Za-z0-9_\-]+\.go:` + Rline
 )
@@ -119,6 +121,30 @@ func TestFlagAndPrefixSetting(t *testing.T) {
        }
 }
 
+func TestUTCFlag(t *testing.T) {
+       var b bytes.Buffer
+       l := New(&b, "Test:", LstdFlags)
+       l.SetFlags(Ldate | Ltime | LUTC)
+       // Verify a log message looks right in the right time zone. Quantize to the second only.
+       now := time.Now().UTC()
+       l.Print("hello")
+       want := fmt.Sprintf("Test:%d/%.2d/%.2d %.2d:%.2d:%.2d hello\n",
+               now.Year(), now.Month(), now.Day(), now.Hour(), now.Minute(), now.Second())
+       got := b.String()
+       if got == want {
+               return
+       }
+       // It's possible we crossed a second boundary between getting now and logging,
+       // so add a second and try again. This should very nearly always work.
+       now.Add(time.Second)
+       want = fmt.Sprintf("Test:%d/%.2d/%.2d %.2d:%.2d:%.2d hello\n",
+               now.Year(), now.Month(), now.Day(), now.Hour(), now.Minute())
+       if got == want {
+               return
+       }
+       t.Errorf("got %q; want %q", got, want)
+}
+
 func TestEmptyPrintCreatesLine(t *testing.T) {
        var b bytes.Buffer
        l := New(&b, "Header:", LstdFlags)