package application import ( "fmt" "os" "runtime" "strings" "time" "github.com/rs/zerolog" ) // Puts memory usage into log lines. func (a *Application) getMemoryUsage(event *zerolog.Event, level zerolog.Level, message string) { var memstats runtime.MemStats runtime.ReadMemStats(&memstats) event.Str("memalloc", fmt.Sprintf("%dMB", memstats.Alloc/1024/1024)) event.Str("memsys", fmt.Sprintf("%dMB", memstats.Sys/1024/1024)) event.Str("numgc", fmt.Sprintf("%d", memstats.NumGC)) } // Initializes logger. func (a *Application) initializeLogger() { // Устанавливаем форматирование логгера. //nolint:exhaustruct output := zerolog.ConsoleWriter{Out: os.Stdout, NoColor: false, TimeFormat: time.RFC3339} output.FormatLevel = func(lvlRaw interface{}) string { var lvl string if lvlAsString, ok := lvlRaw.(string); ok { lvlAsString = strings.ToUpper(lvlAsString) switch lvlAsString { case "DEBUG": lvl = fmt.Sprintf("\x1b[30m%-5s\x1b[0m", lvlAsString) case "ERROR": lvl = fmt.Sprintf("\x1b[31m%-5s\x1b[0m", lvlAsString) case "FATAL": lvl = fmt.Sprintf("\x1b[35m%-5s\x1b[0m", lvlAsString) case "INFO": lvl = fmt.Sprintf("\x1b[32m%-5s\x1b[0m", lvlAsString) case "PANIC": lvl = fmt.Sprintf("\x1b[36m%-5s\x1b[0m", lvlAsString) case "WARN": lvl = fmt.Sprintf("\x1b[33m%-5s\x1b[0m", lvlAsString) default: lvl = lvlAsString } } return fmt.Sprintf("| %s |", lvl) } a.Log = zerolog.New(output).With().Timestamp().Logger() a.Log = a.Log.Hook(zerolog.HookFunc(a.getMemoryUsage)) } // Initialize logger after configuration parse. func (a *Application) initializeLoggerPost() { // Set log level. a.Log.Info().Msgf("Setting logger level: %s", a.Config.Logging.LogLevel) switch a.Config.Logging.LogLevel { case "DEBUG": zerolog.SetGlobalLevel(zerolog.DebugLevel) case "INFO": zerolog.SetGlobalLevel(zerolog.InfoLevel) case "WARN": zerolog.SetGlobalLevel(zerolog.WarnLevel) case "ERROR": zerolog.SetGlobalLevel(zerolog.ErrorLevel) case "FATAL": zerolog.SetGlobalLevel(zerolog.FatalLevel) case "PANIC": zerolog.SetGlobalLevel(zerolog.PanicLevel) } }