@@ -2,6 +2,7 @@ package log
22
33import (
44 "fmt"
5+ "runtime"
56 "strings"
67 "sync"
78 "time"
@@ -14,22 +15,30 @@ const (
1415
1516// Entry represents a single log entry.
1617type Entry struct {
17- WG * sync.WaitGroup `json:"-"`
18- ApplicationID string `json:"appId"`
19- Level Level `json:"level"`
20- Timestamp time.Time `json:"timestamp"`
21- Message string `json:"message"`
22- Fields []Field `json:"fields"`
18+ wg * sync.WaitGroup
19+ calldepth int
20+ ApplicationID string `json:"appId"`
21+ Level Level `json:"level"`
22+ Timestamp time.Time `json:"timestamp"`
23+ Message string `json:"message"`
24+ Fields []Field `json:"fields"`
25+ File string `json:"file"`
26+ Line int `json:"line"`
2327}
2428
25- func newEntry (level Level , message string , fields []Field ) * Entry {
29+ func newEntry (level Level , message string , fields []Field , calldepth int ) * Entry {
2630
2731 entry := Logger .entryPool .Get ().(* Entry )
32+ entry .calldepth = calldepth
2833 entry .Level = level
2934 entry .Message = strings .TrimRight (message , cutset ) // need to trim for adding fields later in handlers + why send uneeded whitespace
3035 entry .Fields = fields
3136 entry .Timestamp = time .Now ().UTC ()
3237
38+ if Logger .logCallerInfo && level != TraceLevel {
39+ _ , entry .File , entry .Line , _ = runtime .Caller (entry .calldepth )
40+ }
41+
3342 return entry
3443}
3544
@@ -39,7 +48,7 @@ var _ LeveledLogger = new(Entry)
3948func (e * Entry ) Debug (v ... interface {}) {
4049 e .Level = DebugLevel
4150 e .Message = fmt .Sprint (v ... )
42- Logger .HandleEntry (e )
51+ Logger .handleEntry (e )
4352}
4453
4554// Trace starts a trace & returns Traceable object to End + log
@@ -59,36 +68,36 @@ func (e *Entry) Trace(v ...interface{}) Traceable {
5968func (e * Entry ) Info (v ... interface {}) {
6069 e .Level = InfoLevel
6170 e .Message = fmt .Sprint (v ... )
62- Logger .HandleEntry (e )
71+ Logger .handleEntry (e )
6372}
6473
6574// Notice level formatted message.
6675func (e * Entry ) Notice (v ... interface {}) {
6776 e .Level = NoticeLevel
6877 e .Message = fmt .Sprint (v ... )
69- Logger .HandleEntry (e )
78+ Logger .handleEntry (e )
7079}
7180
7281// Warn level message.
7382func (e * Entry ) Warn (v ... interface {}) {
7483 e .Level = WarnLevel
7584 e .Message = fmt .Sprint (v ... )
76- Logger .HandleEntry (e )
85+ Logger .handleEntry (e )
7786}
7887
7988// Error level message.
8089func (e * Entry ) Error (v ... interface {}) {
8190 e .Level = ErrorLevel
8291 e .Message = fmt .Sprint (v ... )
83- Logger .HandleEntry (e )
92+ Logger .handleEntry (e )
8493}
8594
8695// Panic logs an Error level formatted message and then panics
8796func (e * Entry ) Panic (v ... interface {}) {
8897 s := fmt .Sprint (v ... )
8998 e .Level = PanicLevel
9099 e .Message = s
91- Logger .HandleEntry (e )
100+ Logger .handleEntry (e )
92101
93102 for _ , f := range e .Fields {
94103 s += fmt .Sprintf (keyVal , f .Key , f .Value )
@@ -101,22 +110,22 @@ func (e *Entry) Panic(v ...interface{}) {
101110func (e * Entry ) Alert (v ... interface {}) {
102111 e .Level = AlertLevel
103112 e .Message = fmt .Sprint (v ... )
104- Logger .HandleEntry (e )
113+ Logger .handleEntry (e )
105114}
106115
107116// Fatal level message, followed by an exit.
108117func (e * Entry ) Fatal (v ... interface {}) {
109118 e .Level = FatalLevel
110119 e .Message = fmt .Sprint (v ... )
111- Logger .HandleEntry (e )
120+ Logger .handleEntry (e )
112121 exitFunc (1 )
113122}
114123
115124// Debugf level formatted message.
116125func (e * Entry ) Debugf (msg string , v ... interface {}) {
117126 e .Level = DebugLevel
118127 e .Message = fmt .Sprintf (msg , v ... )
119- Logger .HandleEntry (e )
128+ Logger .handleEntry (e )
120129}
121130
122131// Tracef starts a trace & returns Traceable object to End + log
@@ -136,36 +145,36 @@ func (e *Entry) Tracef(msg string, v ...interface{}) Traceable {
136145func (e * Entry ) Infof (msg string , v ... interface {}) {
137146 e .Level = InfoLevel
138147 e .Message = fmt .Sprintf (msg , v ... )
139- Logger .HandleEntry (e )
148+ Logger .handleEntry (e )
140149}
141150
142151// Noticef level formatted message.
143152func (e * Entry ) Noticef (msg string , v ... interface {}) {
144153 e .Level = NoticeLevel
145154 e .Message = fmt .Sprintf (msg , v ... )
146- Logger .HandleEntry (e )
155+ Logger .handleEntry (e )
147156}
148157
149158// Warnf level formatted message.
150159func (e * Entry ) Warnf (msg string , v ... interface {}) {
151160 e .Level = WarnLevel
152161 e .Message = fmt .Sprintf (msg , v ... )
153- Logger .HandleEntry (e )
162+ Logger .handleEntry (e )
154163}
155164
156165// Errorf level formatted message.
157166func (e * Entry ) Errorf (msg string , v ... interface {}) {
158167 e .Level = ErrorLevel
159168 e .Message = fmt .Sprintf (msg , v ... )
160- Logger .HandleEntry (e )
169+ Logger .handleEntry (e )
161170}
162171
163172// Panicf logs an Error level formatted message and then panics
164173func (e * Entry ) Panicf (msg string , v ... interface {}) {
165174 s := fmt .Sprintf (msg , v ... )
166175 e .Level = PanicLevel
167176 e .Message = s
168- Logger .HandleEntry (e )
177+ Logger .handleEntry (e )
169178
170179 for _ , f := range e .Fields {
171180 s += fmt .Sprintf (keyVal , f .Key , f .Value )
@@ -178,13 +187,21 @@ func (e *Entry) Panicf(msg string, v ...interface{}) {
178187func (e * Entry ) Alertf (msg string , v ... interface {}) {
179188 e .Level = AlertLevel
180189 e .Message = fmt .Sprintf (msg , v ... )
181- Logger .HandleEntry (e )
190+ Logger .handleEntry (e )
182191}
183192
184193// Fatalf level formatted message, followed by an exit.
185194func (e * Entry ) Fatalf (msg string , v ... interface {}) {
186195 e .Level = FatalLevel
187196 e .Message = fmt .Sprintf (msg , v ... )
188- Logger .HandleEntry (e )
197+ Logger .handleEntry (e )
189198 exitFunc (1 )
190199}
200+
201+ // Consumed lets the Entry and subsequently the Logger
202+ // instance know that it has been used by a handler
203+ func (e * Entry ) Consumed () {
204+ if e .wg != nil {
205+ e .wg .Done ()
206+ }
207+ }
0 commit comments