Skip to content

Commit 092457b

Browse files
authored
log support timezone (#28)
1 parent 6bc8604 commit 092457b

File tree

3 files changed

+108
-69
lines changed

3 files changed

+108
-69
lines changed

log/format.go

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
package log
22

3-
import "errors"
3+
import (
4+
"errors"
5+
"time"
6+
7+
"github.com/sirupsen/logrus"
8+
)
49

510
var (
611
ErrLogFormatInvalid = errors.New("invalid log format name")
@@ -29,3 +34,25 @@ func ParseFormat(format string) (Format, error) {
2934

3035
return TextFormat, ErrLogFormatInvalid
3136
}
37+
38+
type TimeZoneFormatter struct {
39+
formatter *logrus.TextFormatter
40+
loc *time.Location
41+
}
42+
43+
func newTimeZoneFormatter(loc *time.Location) *TimeZoneFormatter {
44+
formatter := new(logrus.TextFormatter)
45+
formatter.TimestampFormat = "2006-01-02 15:04:05.000"
46+
formatter.FullTimestamp = true
47+
return &TimeZoneFormatter{
48+
formatter: formatter,
49+
loc: loc,
50+
}
51+
}
52+
53+
func (f *TimeZoneFormatter) Format(e *logrus.Entry) ([]byte, error) {
54+
if f.loc != nil {
55+
e.Time = e.Time.In(f.loc)
56+
}
57+
return f.formatter.Format(e)
58+
}

log/log.go

Lines changed: 46 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ import (
55
"fmt"
66
"io"
77
"os"
8+
"time"
89

9-
joonix "github.com/joonix/log"
1010
"github.com/sirupsen/logrus"
1111
)
1212

@@ -15,18 +15,15 @@ var g *log
1515

1616
const chSize int = 64
1717

18-
type settings struct {
19-
format Format
20-
formatter *logrus.TextFormatter
21-
}
22-
2318
type log struct {
24-
ctx context.Context
25-
cancel context.CancelFunc
26-
logger *logrus.Logger
27-
entry *logrus.Entry
28-
settings *settings
29-
ch chan func()
19+
ctx context.Context
20+
cancel context.CancelFunc
21+
logger *logrus.Logger
22+
entry *logrus.Entry
23+
opts *Options
24+
formatter *TimeZoneFormatter
25+
ch chan func()
26+
doneCh chan bool
3027
}
3128

3229
func (l *log) log(f func()) {
@@ -39,6 +36,7 @@ func (l *log) log(f func()) {
3936

4037
func (l *log) loop() {
4138
if l.ch != nil {
39+
defer close(l.doneCh)
4240
for {
4341
select {
4442
case f := <-l.ch:
@@ -78,82 +76,62 @@ func init() {
7876
}
7977
}
8078

79+
type Options struct {
80+
Context context.Context
81+
LogLevel Level
82+
Sync bool
83+
Location *time.Location
84+
}
85+
8186
// Initialize the Logger
82-
func Init(logLevel Level, format Format, sync bool) error {
83-
// Create new logger
84-
logger := logrus.New()
85-
logger.SetLevel(logrus.Level(logLevel))
86-
settings := &settings{
87-
format: format,
87+
func Init(opts *Options) error {
88+
if g != nil {
89+
g.stop()
8890
}
8991

90-
switch format {
91-
case TextFormat:
92-
formatter := new(logrus.TextFormatter)
93-
formatter.TimestampFormat = "2006-01-02 15:04:05.000"
94-
formatter.FullTimestamp = true
95-
logger.SetFormatter(formatter)
96-
settings.formatter = formatter
97-
case FluentdFormat:
98-
f := joonix.NewFormatter()
99-
if err := joonix.DisableTimestampFormat(f); err != nil {
100-
return err
101-
}
102-
logger.SetFormatter(f)
103-
case JsonFormat:
104-
logrus.SetFormatter(&logrus.JSONFormatter{})
105-
}
92+
formatter := newTimeZoneFormatter(opts.Location)
10693

94+
// Create new logger
95+
logger := logrus.New()
96+
logger.SetLevel(logrus.Level(opts.LogLevel))
97+
logger.SetFormatter(formatter)
10798
logger.SetOutput(os.Stdout)
10899

109-
if g != nil {
110-
g.stop()
111-
}
112-
ctx, cancel := context.WithCancel(context.Background())
100+
ctx, cancel := context.WithCancel(opts.Context)
113101
g = &log{
114-
ctx: ctx,
115-
cancel: cancel,
116-
logger: logger,
117-
entry: logger.WithFields(logrus.Fields{}),
118-
settings: settings,
102+
ctx: ctx,
103+
cancel: cancel,
104+
logger: logger,
105+
entry: logger.WithFields(logrus.Fields{}),
106+
opts: opts,
107+
formatter: formatter,
119108
}
120109

121-
if !sync {
110+
if !opts.Sync {
122111
g.ch = make(chan func(), chSize)
112+
g.doneCh = make(chan bool)
123113
go g.loop()
124114
}
125115

126116
return nil
127117
}
128118

129-
func ForceColor() {
130-
if g.settings == nil {
131-
return
132-
}
133-
switch g.settings.format {
134-
case TextFormat:
135-
g.settings.formatter.ForceColors = true
136-
g.settings.formatter.DisableColors = false
137-
g.logger.SetFormatter(g.settings.formatter)
138-
case FluentdFormat:
139-
case JsonFormat:
140-
case JournaldFormat:
119+
func WaitForDone() {
120+
if g.doneCh != nil {
121+
<-g.doneCh
141122
}
142123
}
143124

125+
func ForceColor() {
126+
g.formatter.formatter.ForceColors = true
127+
g.formatter.formatter.DisableColors = false
128+
g.logger.SetFormatter(g.formatter)
129+
}
130+
144131
func DisableColor() {
145-
if g.settings == nil {
146-
return
147-
}
148-
switch g.settings.format {
149-
case TextFormat:
150-
g.settings.formatter.ForceColors = false
151-
g.settings.formatter.DisableColors = true
152-
g.logger.SetFormatter(g.settings.formatter)
153-
case FluentdFormat:
154-
case JsonFormat:
155-
case JournaldFormat:
156-
}
132+
g.formatter.formatter.ForceColors = false
133+
g.formatter.formatter.DisableColors = true
134+
g.logger.SetFormatter(g.formatter)
157135
}
158136

159137
func SetLevel(logLevel Level) {

log/log_test.go

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package log_test
2+
3+
import (
4+
"context"
5+
"testing"
6+
"time"
7+
8+
"github.com/photon-storage/go-common/log"
9+
"github.com/photon-storage/go-common/testing/require"
10+
)
11+
12+
func TestLog(t *testing.T) {
13+
t.Skip()
14+
15+
loc, err := time.LoadLocation("US/Eastern")
16+
require.NoError(t, err)
17+
_ = loc
18+
19+
ctx, cancel := context.WithCancel(context.Background())
20+
log.Init(&log.Options{
21+
Context: ctx,
22+
LogLevel: log.DebugLevel,
23+
Sync: false,
24+
Location: loc,
25+
})
26+
27+
log.Debug("Debug message")
28+
log.Info("Info message")
29+
log.Warn("Warn message")
30+
log.Error("Error message")
31+
32+
cancel()
33+
log.WaitForDone()
34+
}

0 commit comments

Comments
 (0)