Изменить формат вывода журнала logrus

Я использую go logrus, и мне нужно изменить формат выходного сообщения, Я попробовал несколько вещей, без успеха

мне нужен такой формат с форматированием logrus

[error]: datetime - message

то, что я пробовал без успеха, это

 logger := &logrus.Logger{
        Out:   os.Stderr,
        Level: level,
        Formatter: &logrus.TextFormatter{
            DisableColors: true,
            TimestampFormat : "2006-01-02 15:04:05",
            FullTimestamp:true,

        },
    }

это производит следующее

time="2018-02-25 10:42:20" level=error msg="Starting Process"

и я хочу, чтобы это было

[INFO]:2018-02-25 10:42:20 - Starting Process

обновление В случае, если zap лучше настроить https://github.com/uber-go/zap это также может быть решением

2 ответов


стандартный логрус-префикс-форматер использование

для этого вам нужно сделать свой собственный TextFormater, который удовлетворит логрус Formatter интерфейс. Затем, когда вы создаете свой собственный форматер, вы передаете его при инициализации структуры logrus. Другой способ вокруг и близко к тому, что вы хотите достичь, это formater https://github.com/x-cray/logrus-prefixed-formatter . На основе этого formater вы можете создать свой собственный.

в вашем случае нужно использовать как это

logger := &logrus.Logger{
        Out:   os.Stderr,
        Level: logrus.DebugLevel,
        Formatter: &prefixed.TextFormatter{
            DisableColors: true,
            TimestampFormat : "2006-01-02 15:04:05",
            FullTimestamp:true,
            ForceFormatting: true,
        },
    }

Подгонянный выход логрус-prefixed-formater

ссылка на gist для использования копии logrus-prefixed-formatter с измененным форматом https://gist.github.com/t-tomalak/146e4269460fc63d6938264bb5aaa1db

я оставляю эту опцию, если вы в конце концов хотите ее использовать, так как в этой версии у вас есть точный формат, который вы хотите, раскраска и другие функции, доступные в стандартном форматтере


пользовательский модуль форматирования

третий опция-использовать пакет, созданный мной https://github.com/t-tomalak/logrus-easy-formatter. Он обеспечивает простой вариант для форматирования вывода, Как вы хотите, и это только цель. Я удалил не необходимые опции, которые, вероятно, вы бы не использовали.

package main

import (
    "os"

    "github.com/sirupsen/logrus"
    "github.com/t-tomalak/logrus-easy-formatter"
)

func main() {
    logger := &logrus.Logger{
        Out:   os.Stderr,
        Level: logrus.DebugLevel,
        Formatter: &easy.Formatter{
            TimestampFormat: "2006-01-02 15:04:05",
            LogFormat:       "[%lvl%]: %time% - %msg%",
        },
    }

    logger.Printf("Log message")
}

этот код образца произведет:

[INFO]: 2018-02-27 19:16:55 - Log message

также я хочу отметить, что если в будущем хотите изменить форматирование, не должно быть никаких проблем с использованием т. е. Логрус по умолчанию TextFormatter/JSONFormatter.


Подгонянный выход логрус-prefixed-formater

если вы действительно не хотите копировать этот форматтер в свой проект, вы можете использовать my fork logrus-prefixed-formater с копией / вставкой этого кода https://github.com/t-tomalak/logrus-prefixed-formatter

вы можете использовать его как стандартный вариант, но не забудьте изменить импорт в мой репозиторий в файле

logger := &logrus.Logger{
        Out:   os.Stderr,
        Level: logrus.DebugLevel,
        Formatter: &prefixed.TextFormatter{
            DisableColors: true,
            TimestampFormat : "2006-01-02 15:04:05",
            FullTimestamp:true,
            ForceFormatting: true,
        },
    }

Я принял этот код из https://github.com/x-cray/logrus-prefixed-formatter/blob/master/formatter.go. Я создал собственный форматер структура и implementend собственной функции format для форматирования интерфейс логрус. Мне нужен только текстовый вывод без цвета, это может быть простое решение.

// adopted from https://github.com/x-cray/logrus-prefixed-formatter/blob/master/formatter.go
package main

import (
    "bytes"
    "fmt"
    "log"
    "os"
    "strings"

    "github.com/sirupsen/logrus"
)

type LogFormat struct {
    TimestampFormat string
}

func (f *LogFormat) Format(entry *logrus.Entry) ([]byte, error) {
    var b *bytes.Buffer

    if entry.Buffer != nil {
        b = entry.Buffer
    } else {
        b = &bytes.Buffer{}
    }

    b.WriteByte('[')
    b.WriteString(strings.ToUpper(entry.Level.String()))
    b.WriteString("]:")
    b.WriteString(entry.Time.Format(f.TimestampFormat))

    if entry.Message != "" {
        b.WriteString(" - ")
        b.WriteString(entry.Message)
    }

    if len(entry.Data) > 0 {
        b.WriteString(" || ")
    }
    for key, value := range entry.Data {
        b.WriteString(key)
        b.WriteByte('=')
        b.WriteByte('{')
        fmt.Fprint(b, value)
        b.WriteString("}, ")
    }

    b.WriteByte('\n')
    return b.Bytes(), nil
}

func main() {
    formatter := LogFormat{}
    formatter.TimestampFormat = "2006-01-02 15:04:05"

    logrus.SetFormatter(&formatter)
    log.SetOutput(os.Stderr)

    logrus.WithFields(logrus.Fields{
        "animal": "walrus",
        "size":   10,
    }).Info("A group of walrus emerges from the ocean")
    logrus.Info("ugh ugh ugh ugh")
}