func ReadLoggingConfig(modes []string, logsPath string, cfg *ini.File) { Close() defaultLevelName, _ := getLogLevelFromConfig("log", "info", cfg) defaultFilters := getFilters(cfg.Section("log").Key("filters").Strings(" ")) handlers := make([]log15.Handler, 0) for _, mode := range modes { mode = strings.TrimSpace(mode) sec, err := cfg.GetSection("log." + mode) if err != nil { Root.Error("Unknown log mode", "mode", mode) } // Log level. _, level := getLogLevelFromConfig("log."+mode, defaultLevelName, cfg) modeFilters := getFilters(sec.Key("filters").Strings(" ")) format := getLogFormat(sec.Key("format").MustString("")) var handler log15.Handler // Generate log configuration. switch mode { case "console": handler = log15.StreamHandler(os.Stdout, format) case "file": fileName := sec.Key("file_name").MustString(filepath.Join(logsPath, "grafana.log")) os.MkdirAll(filepath.Dir(fileName), os.ModePerm) fileHandler := NewFileWriter() fileHandler.Filename = fileName fileHandler.Format = format fileHandler.Rotate = sec.Key("log_rotate").MustBool(true) fileHandler.Maxlines = sec.Key("max_lines").MustInt(1000000) fileHandler.Maxsize = 1 << uint(sec.Key("max_size_shift").MustInt(28)) fileHandler.Daily = sec.Key("daily_rotate").MustBool(true) fileHandler.Maxdays = sec.Key("max_days").MustInt64(7) fileHandler.Init() loggersToClose = append(loggersToClose, fileHandler) handler = fileHandler case "syslog": sysLogHandler := NewSyslog(sec, format) loggersToClose = append(loggersToClose, sysLogHandler) handler = sysLogHandler } for key, value := range defaultFilters { if _, exist := modeFilters[key]; !exist { modeFilters[key] = value } } handler = LogFilterHandler(level, modeFilters, handler) handlers = append(handlers, handler) } Root.SetHandler(log15.MultiHandler(handlers...)) }
// DebugContext returns a new Context with an additional handler with a more // verbose filter (using the Debug level) and a Buffer in which all logging // statements will be (also) written to. func (context *Context) DebugContext(logCtx ...interface{}) *Context { var buffer bytes.Buffer childContext := &Context{ Config: context.Config, Log: context.Log.New(logCtx...), logBuffer: &buffer, handler: log15.MultiHandler( log15.StreamHandler(&buffer, log15.LogfmtFormat()), context.handler, ), memoryCollector: NewMemoryEventCollector(), EventFactory: context.EventFactory, } childContext.EventCollector = NewMultiEventCollector( childContext.memoryCollector, context.EventCollector, ) childContext.EventFactory.Register(childContext.memoryCollector) childContext.Log.SetHandler(childContext.handler) return childContext }