Изменить формат вывода журнала 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")
}