From e88e4e7d4f7c2f6c8652796f6a52f852554234e2 Mon Sep 17 00:00:00 2001 From: Alistair Mackay <34012094+fireflycons@users.noreply.github.com> Date: Mon, 22 Apr 2024 06:04:07 +0100 Subject: [PATCH 1/4] Don't test syslog on windows --- syslog_test.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/syslog_test.go b/syslog_test.go index b83f6f27..e89d8bb4 100644 --- a/syslog_test.go +++ b/syslog_test.go @@ -1,3 +1,6 @@ +//go:build !windows +// +build !windows + package log import ( From 284e3797cbb75ba04f67ddce84b8511732eea108 Mon Sep 17 00:00:00 2001 From: Alistair Mackay <34012094+fireflycons@users.noreply.github.com> Date: Mon, 22 Apr 2024 06:05:50 +0100 Subject: [PATCH 2/4] Allow selecting UTC time in timestamp header --- logger.go | 36 ++++++++++++++++++++++++++---------- 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/logger.go b/logger.go index f5d128a8..607a66b7 100644 --- a/logger.go +++ b/logger.go @@ -78,13 +78,16 @@ type Logger struct { // If Caller is negative, adds the full /path/to/file:line of the "caller" key. Caller int - // TimeField defines the time filed name in output. It uses "time" in if empty. + // TimeField defines the time field name in output. It uses "time" in if empty. TimeField string // TimeFormat specifies the time format in output. It uses time.RFC3339 with milliseconds if empty. // If set with `TimeFormatUnix`, `TimeFormatUnixMs`, times are formated as UNIX timestamp. TimeFormat string + // TimeUTC specifices that the timestamps should be UTC instead of system local time. + TimeUTC bool + // Context specifies an optional context of logger. Context Context @@ -450,6 +453,19 @@ func (l *Logger) silent(level Level) bool { } func (l *Logger) header(level Level) *Entry { + headerTimeFunc := timeNow + headerTimeOffset := timeOffset + headerTimeZone := timeZone + + if l.TimeUTC { + headerTimeFunc = func () time.Time { + return time.Now().UTC() + } + + headerTimeOffset = 0 + headerTimeZone = "Z" + } + e := epool.Get().(*Entry) e.buf = e.buf[:0] e.Level = level @@ -471,7 +487,7 @@ func (l *Logger) header(level Level) *Entry { sec, nsec, _ := now() var tmp [32]byte var buf []byte - if timeOffset == 0 { + if headerTimeOffset == 0 { // "2006-01-02T15:04:05.999Z" tmp[25] = '"' tmp[24] = 'Z' @@ -479,16 +495,16 @@ func (l *Logger) header(level Level) *Entry { } else { // "2006-01-02T15:04:05.999Z07:00" tmp[30] = '"' - tmp[29] = timeZone[5] - tmp[28] = timeZone[4] - tmp[27] = timeZone[3] - tmp[26] = timeZone[2] - tmp[25] = timeZone[1] - tmp[24] = timeZone[0] + tmp[29] = headerTimeZone[5] + tmp[28] = headerTimeZone[4] + tmp[27] = headerTimeZone[3] + tmp[26] = headerTimeZone[2] + tmp[25] = headerTimeZone[1] + tmp[24] = headerTimeZone[0] buf = tmp[:31] } // date time - sec += 9223372028715321600 + timeOffset // unixToInternal + internalToAbsolute + timeOffset + sec += 9223372028715321600 + headerTimeOffset // unixToInternal + internalToAbsolute + timeOffset year, month, day, _ := absDate(uint64(sec), true) hour, minute, second := absClock(uint64(sec)) // year @@ -626,7 +642,7 @@ func (l *Logger) header(level Level) *Entry { e.buf = append(e.buf, tmp[:]...) default: e.buf = append(e.buf, '"') - e.buf = timeNow().AppendFormat(e.buf, l.TimeFormat) + e.buf = headerTimeFunc().AppendFormat(e.buf, l.TimeFormat) e.buf = append(e.buf, '"') } // level From 6cfa5b1c5dedaccf431225db921cce7cec18541d Mon Sep 17 00:00:00 2001 From: Alistair Mackay <34012094+fireflycons@users.noreply.github.com> Date: Mon, 22 Apr 2024 06:42:17 +0100 Subject: [PATCH 3/4] Declare func for UTC time outside the method May save a few ns. --- logger.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/logger.go b/logger.go index 607a66b7..cea148e8 100644 --- a/logger.go +++ b/logger.go @@ -441,6 +441,9 @@ const smallsString = "00010203040506070809" + "90919293949596979899" var timeNow = time.Now +var timeUtcNow = func() time.Time { + return time.Now().UTC() +} var timeOffset, timeZone = func() (int64, string) { now := timeNow() _, n := now.Zone() @@ -458,10 +461,7 @@ func (l *Logger) header(level Level) *Entry { headerTimeZone := timeZone if l.TimeUTC { - headerTimeFunc = func () time.Time { - return time.Now().UTC() - } - + headerTimeFunc = timeUtcNow headerTimeOffset = 0 headerTimeZone = "Z" } From 7e5c89cff28322657434823b780464d5d131d1c8 Mon Sep 17 00:00:00 2001 From: Alistair Mackay <34012094+fireflycons@users.noreply.github.com> Date: Mon, 22 Apr 2024 06:47:17 +0100 Subject: [PATCH 4/4] Removed headerTimeZone timeZone var isn't accessed if offest is zero --- logger.go | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/logger.go b/logger.go index cea148e8..5c73f9e2 100644 --- a/logger.go +++ b/logger.go @@ -458,12 +458,10 @@ func (l *Logger) silent(level Level) bool { func (l *Logger) header(level Level) *Entry { headerTimeFunc := timeNow headerTimeOffset := timeOffset - headerTimeZone := timeZone if l.TimeUTC { headerTimeFunc = timeUtcNow headerTimeOffset = 0 - headerTimeZone = "Z" } e := epool.Get().(*Entry) @@ -495,12 +493,12 @@ func (l *Logger) header(level Level) *Entry { } else { // "2006-01-02T15:04:05.999Z07:00" tmp[30] = '"' - tmp[29] = headerTimeZone[5] - tmp[28] = headerTimeZone[4] - tmp[27] = headerTimeZone[3] - tmp[26] = headerTimeZone[2] - tmp[25] = headerTimeZone[1] - tmp[24] = headerTimeZone[0] + tmp[29] = timeZone[5] + tmp[28] = timeZone[4] + tmp[27] = timeZone[3] + tmp[26] = timeZone[2] + tmp[25] = timeZone[1] + tmp[24] = timeZone[0] buf = tmp[:31] } // date time