@@ -4,22 +4,41 @@ import (
4
4
"context"
5
5
"encoding/json"
6
6
"io"
7
+ "runtime"
7
8
8
9
lslog "github.com/labstack/gommon/log"
9
10
"github.com/sirupsen/logrus"
10
11
)
11
12
12
- // EchoLogrusLogger extend logrus.Logger
13
+ // EchoLogrusLogger extend logrus.Logger to implement Echo's Logger interface.
13
14
type EchoLogrusLogger struct {
14
- * logrus.Logger
15
- Ctx context.Context
15
+ logger * logrus.Logger
16
+ ctx context.Context
17
+ writer * io.PipeWriter
18
+ }
19
+
20
+ // NewEchoLogrusLogger creates a new EchoLogrusLogger instance. Logger must be closed
21
+ // with Close() method to avoid memory leaks.
22
+ func NewEchoLogrusLogger (logger * logrus.Logger , ctx context.Context ) * EchoLogrusLogger {
23
+ return & EchoLogrusLogger {
24
+ logger : logger ,
25
+ ctx : ctx ,
26
+ writer : logger .Writer (),
27
+ }
28
+ }
29
+
30
+ var commonLogger * EchoLogrusLogger
31
+
32
+ func init () {
33
+ commonLogger = NewEchoLogrusLogger (logrus .StandardLogger (), context .Background ())
34
+ runtime .SetFinalizer (commonLogger , close )
16
35
}
17
36
18
- var commonLogger = & EchoLogrusLogger {
19
- Logger : logrus .StandardLogger (),
20
- Ctx : context .Background (),
37
+ func close (l * EchoLogrusLogger ) {
38
+ l .Close ()
21
39
}
22
40
41
+ // Logger returns the common logger configured with logrus StandardLogger and context.Background().
23
42
func Logger () * EchoLogrusLogger {
24
43
return commonLogger
25
44
}
@@ -39,16 +58,23 @@ func toEchoLevel(level logrus.Level) lslog.Lvl {
39
58
return lslog .OFF
40
59
}
41
60
61
+ func (l * EchoLogrusLogger ) Close () {
62
+ if l .writer != nil {
63
+ l .writer .Close ()
64
+ l .writer = nil
65
+ }
66
+ }
67
+
42
68
func (l * EchoLogrusLogger ) Output () io.Writer {
43
- return l .Out
69
+ return l .writer
44
70
}
45
71
46
72
func (l * EchoLogrusLogger ) SetOutput (w io.Writer ) {
47
73
// disable operations that would change behavior of global logrus logger.
48
74
}
49
75
50
76
func (l * EchoLogrusLogger ) Level () lslog.Lvl {
51
- return toEchoLevel (l .Logger .Level )
77
+ return toEchoLevel (l .logger .Level )
52
78
}
53
79
54
80
func (l * EchoLogrusLogger ) SetLevel (v lslog.Lvl ) {
@@ -66,117 +92,119 @@ func (l *EchoLogrusLogger) SetPrefix(p string) {
66
92
}
67
93
68
94
func (l * EchoLogrusLogger ) Print (i ... interface {}) {
69
- l .Logger .WithContext (l .Ctx ).Print (i ... )
95
+ l .logger .WithContext (l .ctx ).Print (i ... )
70
96
}
71
97
72
98
func (l * EchoLogrusLogger ) Printf (format string , args ... interface {}) {
73
- l .Logger .WithContext (l .Ctx ).Printf (format , args ... )
99
+ l .logger .WithContext (l .ctx ).Printf (format , args ... )
74
100
}
75
101
76
102
func (l * EchoLogrusLogger ) Printj (j lslog.JSON ) {
77
103
b , err := json .Marshal (j )
78
104
if err != nil {
79
105
panic (err )
80
106
}
81
- l .Logger .WithContext (l .Ctx ).Println (string (b ))
107
+ l .logger .WithContext (l .ctx ).Println (string (b ))
82
108
}
83
109
84
110
func (l * EchoLogrusLogger ) Debug (i ... interface {}) {
85
- l .Logger .WithContext (l .Ctx ).Debug (i ... )
111
+ l .logger .WithContext (l .ctx ).Debug (i ... )
86
112
}
87
113
88
114
func (l * EchoLogrusLogger ) Debugf (format string , args ... interface {}) {
89
- l .Logger .WithContext (l .Ctx ).Debugf (format , args ... )
115
+ l .logger .WithContext (l .ctx ).Debugf (format , args ... )
90
116
}
91
117
92
118
func (l * EchoLogrusLogger ) Debugj (j lslog.JSON ) {
93
119
b , err := json .Marshal (j )
94
120
if err != nil {
95
121
panic (err )
96
122
}
97
- l .Logger .WithContext (l .Ctx ).Debugln (string (b ))
123
+ l .logger .WithContext (l .ctx ).Debugln (string (b ))
98
124
}
99
125
100
126
func (l * EchoLogrusLogger ) Info (i ... interface {}) {
101
- l .Logger .WithContext (l .Ctx ).Info (i ... )
127
+ l .logger .WithContext (l .ctx ).Info (i ... )
102
128
}
103
129
104
130
func (l * EchoLogrusLogger ) Infof (format string , args ... interface {}) {
105
- l .Logger .WithContext (l .Ctx ).Infof (format , args ... )
131
+ l .logger .WithContext (l .ctx ).Infof (format , args ... )
106
132
}
107
133
108
134
func (l * EchoLogrusLogger ) Infoj (j lslog.JSON ) {
109
135
b , err := json .Marshal (j )
110
136
if err != nil {
111
137
panic (err )
112
138
}
113
- l .Logger .WithContext (l .Ctx ).Infoln (string (b ))
139
+ l .logger .WithContext (l .ctx ).Infoln (string (b ))
114
140
}
115
141
116
142
func (l * EchoLogrusLogger ) Warn (i ... interface {}) {
117
- l .Logger .WithContext (l .Ctx ).Warn (i ... )
143
+ l .logger .WithContext (l .ctx ).Warn (i ... )
118
144
}
119
145
120
146
func (l * EchoLogrusLogger ) Warnf (format string , args ... interface {}) {
121
- l .Logger .WithContext (l .Ctx ).Warnf (format , args ... )
147
+ l .logger .WithContext (l .ctx ).Warnf (format , args ... )
122
148
}
123
149
124
150
func (l * EchoLogrusLogger ) Warnj (j lslog.JSON ) {
125
151
b , err := json .Marshal (j )
126
152
if err != nil {
127
153
panic (err )
128
154
}
129
- l .Logger .WithContext (l .Ctx ).Warnln (string (b ))
155
+ l .logger .WithContext (l .ctx ).Warnln (string (b ))
130
156
}
131
157
132
158
func (l * EchoLogrusLogger ) Error (i ... interface {}) {
133
- l .Logger .WithContext (l .Ctx ).Error (i ... )
159
+ l .logger .WithContext (l .ctx ).Error (i ... )
134
160
}
135
161
136
162
func (l * EchoLogrusLogger ) Errorf (format string , args ... interface {}) {
137
- l .Logger .WithContext (l .Ctx ).Errorf (format , args ... )
163
+ l .logger .WithContext (l .ctx ).Errorf (format , args ... )
138
164
}
139
165
140
166
func (l * EchoLogrusLogger ) Errorj (j lslog.JSON ) {
141
167
b , err := json .Marshal (j )
142
168
if err != nil {
143
169
panic (err )
144
170
}
145
- l .Logger .WithContext (l .Ctx ).Errorln (string (b ))
171
+ l .logger .WithContext (l .ctx ).Errorln (string (b ))
146
172
}
147
173
148
174
func (l * EchoLogrusLogger ) Fatal (i ... interface {}) {
149
- l .Logger .WithContext (l .Ctx ).Fatal (i ... )
175
+ l .logger .WithContext (l .ctx ).Fatal (i ... )
150
176
}
151
177
152
178
func (l * EchoLogrusLogger ) Fatalf (format string , args ... interface {}) {
153
- l .Logger .WithContext (l .Ctx ).Fatalf (format , args ... )
179
+ l .logger .WithContext (l .ctx ).Fatalf (format , args ... )
154
180
}
155
181
156
182
func (l * EchoLogrusLogger ) Fatalj (j lslog.JSON ) {
157
183
b , err := json .Marshal (j )
158
184
if err != nil {
159
185
panic (err )
160
186
}
161
- l .Logger .WithContext (l .Ctx ).Fatalln (string (b ))
187
+ l .logger .WithContext (l .ctx ).Fatalln (string (b ))
162
188
}
163
189
164
190
func (l * EchoLogrusLogger ) Panic (i ... interface {}) {
165
- l .Logger .WithContext (l .Ctx ).Panic (i ... )
191
+ l .logger .WithContext (l .ctx ).Panic (i ... )
166
192
}
167
193
168
194
func (l * EchoLogrusLogger ) Panicf (format string , args ... interface {}) {
169
- l .Logger .WithContext (l .Ctx ).Panicf (format , args ... )
195
+ l .logger .WithContext (l .ctx ).Panicf (format , args ... )
170
196
}
171
197
172
198
func (l * EchoLogrusLogger ) Panicj (j lslog.JSON ) {
173
199
b , err := json .Marshal (j )
174
200
if err != nil {
175
201
panic (err )
176
202
}
177
- l .Logger .WithContext (l .Ctx ).Panicln (string (b ))
203
+ l .logger .WithContext (l .ctx ).Panicln (string (b ))
178
204
}
179
205
206
+ // Write method is heavily used by the stdlib log package and called
207
+ // from the weldr API.
180
208
func (l * EchoLogrusLogger ) Write (p []byte ) (n int , err error ) {
181
- return l .Logger . WithContext ( l . Ctx ). Writer () .Write (p )
209
+ return l .writer .Write (p )
182
210
}
0 commit comments