Как настроить вывод номера строки исходного кода для логирования в logrus?

Если делать так:

func init() {
    log.SetFlags(log.LstdFlags | log.Lshortfile)
}

то получаем в логе номер строки вызова функции логирования ошибки. В стандартном логе. В нестандартном - типа logrus, эти флаги никакого влияния не имеют.


Ответы (1 шт):

Автор решения: diafour

У логеров обычно совпадает только интерфейс логирования: методы навроде Info, Warn, Error, а настройки сделаны по-разному. У logrus есть Set* методы и структуры *Formatter для настроек форматирования.

Чтобы получить в логе имя файла и строку, нужно включить "ReportCaller". По умолчанию выводится полный путь к файлу со строкой в поле file и имя метода с полным путём пакета в поле func. Чтобы вывести имя файла и строку, нужно определить свой метод CallerPrettyfier в нужном варианте Formatter'а:

    log.SetReportCaller(true)

    log.SetFormatter(&log.TextFormatter{
        CallerPrettyfier: func(f *runtime.Frame) (string, string) {
            _, filename := path.Split(f.File)
            filename = fmt.Sprintf("%s:%d", filename, f.Line)
            return "", filename
        }
    )

    log.Errorf("error is occured")

Этот код выдаст такую строчку в лог:

time="2020-12-11T10:25:39+03:00" level=error msg="error is occured" file="util_test.go:37"

У форматеров в logrus много опций, можно настроить вывод под нужды проекта.

→ Ссылка