@@ -90,21 +90,40 @@ var logLevels = map[string]log15.Lvl{
90
90
"Critical" : log15 .LvlCrit ,
91
91
}
92
92
93
- func getLogLevel (key string , defaultName string , cfg * ini.File ) (string , log15.Lvl ) {
93
+ func getLogLevelFromConfig (key string , defaultName string , cfg * ini.File ) (string , log15.Lvl ) {
94
94
levelName := cfg .Section (key ).Key ("level" ).In (defaultName , []string {"Trace" , "Debug" , "Info" , "Warn" , "Error" , "Critical" })
95
+ level := getLogLevelFromString (levelName )
96
+ return levelName , level
97
+ }
95
98
99
+ func getLogLevelFromString (levelName string ) log15.Lvl {
96
100
level , ok := logLevels [levelName ]
101
+
97
102
if ! ok {
98
103
Root .Error ("Unknown log level" , "level" , levelName )
104
+ return log15 .LvlError
99
105
}
100
106
101
- return levelName , level
107
+ return level
108
+ }
109
+
110
+ func getFilters (filterStrArray []string ) map [string ]log15.Lvl {
111
+ filterMap := make (map [string ]log15.Lvl )
112
+
113
+ for _ , filterStr := range filterStrArray {
114
+ parts := strings .Split (filterStr , ":" )
115
+ filterMap [parts [0 ]] = getLogLevelFromString (parts [1 ])
116
+ }
117
+
118
+ return filterMap
102
119
}
103
120
104
121
func ReadLoggingConfig (modes []string , logsPath string , cfg * ini.File ) {
105
122
Close ()
106
123
107
- defaultLevelName , _ := getLogLevel ("log" , "Info" , cfg )
124
+ defaultLevelName , _ := getLogLevelFromConfig ("log" , "Info" , cfg )
125
+ defaultFilters := getFilters (cfg .Section ("log" ).Key ("filters" ).Strings (" " ))
126
+
108
127
handlers := make ([]log15.Handler , 0 )
109
128
110
129
for _ , mode := range modes {
@@ -115,12 +134,15 @@ func ReadLoggingConfig(modes []string, logsPath string, cfg *ini.File) {
115
134
}
116
135
117
136
// Log level.
118
- _ , level := getLogLevel ("log." + mode , defaultLevelName , cfg )
137
+ _ , level := getLogLevelFromConfig ("log." + mode , defaultLevelName , cfg )
138
+ modeFilters := getFilters (sec .Key ("filters" ).Strings (" " ))
139
+
140
+ var handler log15.Handler
119
141
120
142
// Generate log configuration.
121
143
switch mode {
122
144
case "console" :
123
- handlers = append ( handlers , log15 .LvlFilterHandler ( level , log15 . StdoutHandler ))
145
+ handler = log15 .StdoutHandler
124
146
case "file" :
125
147
fileName := sec .Key ("file_name" ).MustString (filepath .Join (logsPath , "grafana.log" ))
126
148
os .MkdirAll (filepath .Dir (fileName ), os .ModePerm )
@@ -134,7 +156,7 @@ func ReadLoggingConfig(modes []string, logsPath string, cfg *ini.File) {
134
156
fileHandler .Init ()
135
157
136
158
loggersToClose = append (loggersToClose , fileHandler )
137
- handlers = append ( handlers , log15 . LvlFilterHandler ( level , fileHandler ))
159
+ handler = fileHandler
138
160
139
161
// case "conn":
140
162
// LogConfigs[i] = util.DynMap{
@@ -168,7 +190,41 @@ func ReadLoggingConfig(modes []string, logsPath string, cfg *ini.File) {
168
190
// "tag": sec.Key("tag").MustString(""),
169
191
// }
170
192
}
193
+
194
+ for key , value := range defaultFilters {
195
+ if _ , exist := modeFilters [key ]; ! exist {
196
+ modeFilters [key ] = value
197
+ }
198
+ }
199
+
200
+ for key , value := range modeFilters {
201
+ fmt .Printf ("key: %v, value: %v \n " , key , value )
202
+ }
203
+
204
+ handler = LogFilterHandler (level , modeFilters , handler )
205
+ handlers = append (handlers , handler )
171
206
}
172
207
173
208
Root .SetHandler (log15 .MultiHandler (handlers ... ))
174
209
}
210
+
211
+ func LogFilterHandler (maxLevel log15.Lvl , filters map [string ]log15.Lvl , h log15.Handler ) log15.Handler {
212
+ return log15 .FilterHandler (func (r * log15.Record ) (pass bool ) {
213
+
214
+ if len (filters ) > 0 {
215
+ for i := 0 ; i < len (r .Ctx ); i += 2 {
216
+ key := r .Ctx [i ].(string )
217
+ if key == "logger" {
218
+ loggerName , strOk := r .Ctx [i + 1 ].(string )
219
+ if strOk {
220
+ if filterLevel , ok := filters [loggerName ]; ok {
221
+ return r .Lvl <= filterLevel
222
+ }
223
+ }
224
+ }
225
+ }
226
+ }
227
+
228
+ return r .Lvl <= maxLevel
229
+ }, h )
230
+ }
0 commit comments