@@ -48,6 +48,13 @@ var safeStderr = writer.NewSafeWriter(os.Stderr)
48
48
49
49
var lockStack = stack .NewStack ()
50
50
51
+ type FileLevel struct {
52
+ Level LogLevel
53
+ File * os.File
54
+ Tags * map [string ]interface {}
55
+ lock * sync.Mutex
56
+ }
57
+
51
58
type Logger struct {
52
59
AppName string
53
60
IsLoggingJSON bool
@@ -59,7 +66,7 @@ type Logger struct {
59
66
LockUuid string
60
67
EnvPrefix string
61
68
LogLevel LogLevel
62
- Files []* os. File
69
+ Files []* FileLevel
63
70
}
64
71
65
72
type LoggerParams struct {
@@ -73,19 +80,49 @@ type LoggerParams struct {
73
80
LockUuid string
74
81
EnvPrefix string
75
82
LogLevel LogLevel
76
- Files []* os.File
83
+ Files []* FileLevel
84
+ }
85
+
86
+ func mapFileLevels (x []* FileLevel ) []* FileLevel {
87
+
88
+ var results = []* FileLevel {}
89
+ var m = map [uintptr ]* sync.Mutex {}
90
+
91
+ for _ , z := range x {
92
+
93
+ if _ , ok := m [z .File .Fd ()]; ! ok {
94
+ m [z .File .Fd ()] = & sync.Mutex {}
95
+ }
96
+
97
+ x , _ := m [z .File .Fd ()]
98
+
99
+ z := & FileLevel {
100
+ Level : z .Level ,
101
+ File : z .File ,
102
+ Tags : z .Tags ,
103
+ lock : x ,
104
+ }
105
+ results = append (results , z )
106
+ }
107
+
108
+ return results
77
109
}
78
110
79
111
func NewLogger (p LoggerParams ) * Logger {
80
112
81
- var files = []* os. File {}
113
+ var files = []* FileLevel {}
82
114
83
115
if p .Files != nil {
84
- files = p .Files [:]
116
+ files = mapFileLevels ( p .Files )
85
117
}
86
118
87
119
if len (files ) < 1 {
88
- files = append (files , os .Stdout )
120
+ files = append (files , & FileLevel {
121
+ Level : TRACE ,
122
+ File : os .Stdout ,
123
+ Tags : nil ,
124
+ lock : nil ,
125
+ })
89
126
}
90
127
91
128
hostName := p .HostName
@@ -160,7 +197,7 @@ func NewLogger(p LoggerParams) *Logger {
160
197
}
161
198
}
162
199
163
- func isSameFile (fd1 , fd2 uintptr ) (bool , error ) {
200
+ func isSameFile (fd1 uintptr , fd2 uintptr ) (bool , error ) {
164
201
var stat1 , stat2 syscall.Stat_t
165
202
if err := syscall .Fstat (int (fd1 ), & stat1 ); err != nil {
166
203
return false , err
@@ -184,7 +221,7 @@ func checkIfSameFile() {
184
221
}
185
222
}
186
223
187
- func NewBasicLogger (AppName string , envTokenPrefix string , level LogLevel , files ... * os. File ) * Logger {
224
+ func NewBasicLogger (AppName string , envTokenPrefix string , level LogLevel , files ... * FileLevel ) * Logger {
188
225
return NewLogger (LoggerParams {
189
226
AppName : AppName ,
190
227
EnvPrefix : envTokenPrefix ,
@@ -193,7 +230,7 @@ func NewBasicLogger(AppName string, envTokenPrefix string, level LogLevel, files
193
230
})
194
231
}
195
232
196
- func New (AppName string , envTokenPrefix string , level LogLevel , files []* os. File ) * Logger {
233
+ func New (AppName string , envTokenPrefix string , level LogLevel , files []* FileLevel ) * Logger {
197
234
return NewLogger (LoggerParams {
198
235
AppName : AppName ,
199
236
EnvPrefix : envTokenPrefix ,
@@ -930,7 +967,10 @@ var DefaultLogger = New(
930
967
"Default" ,
931
968
"" ,
932
969
TRACE ,
933
- []* os.File {os .Stdout },
970
+ []* FileLevel {& FileLevel {
971
+ Level : TRACE ,
972
+ File : os .Stdout ,
973
+ }},
934
974
)
935
975
936
976
func init () {
0 commit comments