Как разграничить логирование по уровням и выходным приемникам?
Я использую logrus для логирования в Golang. Логи идут в два приемника: stdout и файл. Для объединения используется стандартный мультирайтер. Но хотелось бы разделить логи не только по приемникам, но и по уровням. Чтобы в stdout шли логи уровня INFO, а вот в файл писались только ошибки. Существует ли такая возможность разграничения в logrus или каком-то ином логгере?
logWriter, err := os.OpenFile(
logFile,
os.O_APPEND|os.O_CREATE|os.O_WRONLY,
0644,
)
if err != nil {
log.Fatalf("[LOGFILE] %s", err.Error())
} else {
log.Infof("[LOGFILE]:%s\n", logFile)
}
mw = io.MultiWriter(
ansicolor.NewAnsiColorWriter(os.Stdout),
logWriter,
)
log.SetOutput(mw)
Ответы (2 шт):
На уровне Writer эту задачу решить нельзя, т.к. информация об уровне, на котором было залогировано сообщение, уже потеряна. Решить эту задачу в рамках logrus можно используя Hooks.
Сам logger пишет в os.Stdout, но в logger добавляется hook на нужные уровни, который пишет в файл:
import "github.com/sirupsen/logrus/hooks/writer"
...
log.Hooks.Add(&writer.Hook{
Writer: logWriter,
LogLevels: []logrus.Level{logrus.Error},
})
По совету Pavel Borzenkov решил свой вопрос так:
import (
log "github.com/sirupsen/logrus"
"github.com/sirupsen/logrus/hooks/writer"
)
...
//----------------------------
// конфигурация логгера
log.SetFormatter(&log.TextFormatter{
ForceColors: true,
FullTimestamp: true,
TimestampFormat: "01/02 15:04:05",
})
log.SetOutput(ansicolor.NewAnsiColorWriter(os.Stdout))
log.SetLevel(log.Level(*logLevel)) //log.DebugLevel
log.AddHook (&writer.Hook{
Writer: logWriter,
LogLevels: []log.Level{
log.PanicLevel,
log.FatalLevel,
log.ErrorLevel,
log.WarnLevel,
log.InfoLevel,
},
})
А те сообщения, которые я не хотел видеть в файловом логе (они выводились в цикле) сделал дебаговыми.