
本文介绍如何通过实现自定义 Formatter,让 Logrus 输出不带字段键(如 time=、level=)的简洁纯文本日志,例如 ERRO 2024-03-26 03:37:58 Not fatal. An error...,适用于文件输出场景。
本文介绍如何通过实现自定义 `formatter`,让 logrus 输出不带字段键(如 `time=`、`level=`)的简洁纯文本日志,例如 `erro 2024-03-26 03:37:58 not fatal. an error...`,适用于文件输出场景。
Logrus 默认使用 TextFormatter,其输出包含结构化字段名(如 time="..." level=error msg="..."),便于解析但不够简洁。若需类比标准错误输出(stderr)的紧凑格式——即仅保留日志级别缩写、时间戳和消息正文——必须替换为自定义格式器(Formatter)。
核心思路是实现 logrus.Formatter 接口,重写 Format() 方法,手动拼接所需字段,跳过键名、JSON 序列化及额外空格。以下是一个轻量、可复用的 PlainFormatter 示例:
package main
import (
"fmt"
log "github.com/sirupsen/logrus"
)
type PlainFormatter struct {
TimestampFormat string
LevelDesc []string // 索引按 logrus.Level 顺序:Panic, Fatal, Error, Warn, Info, Debug
}
func (f *PlainFormatter) Format(entry *log.Entry) ([]byte, error) {
levelStr := f.LevelDesc[entry.Level]
timestamp := entry.Time.Format(f.TimestampFormat)
return []byte(fmt.Sprintf("%s %s %s\n", levelStr, timestamp, entry.Message)), nil
}
func main() {
// 配置格式器
plain := &PlainFormatter{
TimestampFormat: "2006-01-02 15:04:05",
LevelDesc: []string{
"PANC", // logrus.PanicLevel
"FATL", // logrus.FatalLevel
"ERRO", // logrus.ErrorLevel
"WARN", // logrus.WarnLevel
"INFO", // logrus.InfoLevel
"DEBG", // logrus.DebugLevel
},
}
log.SetFormatter(plain)
// 可选:设置输出到文件(而非默认 stdout)
// file, _ := os.OpenFile("app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
// log.SetOutput(file)
log.Errorln("Not fatal. An error. Won't stop execution")
log.Infoln("Just some info")
}
运行后输出如下(无任何字段名,纯空格分隔):
ERRO 2006-01-02 15:04:05 Not fatal. An error. Won't stop execution INFO 2006-01-02 15:04:05 Just some info
⚠️ 注意事项:
-
LevelDesc切片长度必须为 6,且顺序严格对应logrus.Level枚举值(0–5),否则越界 panic; - 此格式器忽略所有
Fields(如log.WithField("user_id", 123)),仅保留entry.Message和基础元数据。若需保留部分字段,请在Format()中显式提取并拼接; - 若需同时支持文件与控制台输出,建议封装为可配置的 Formatter,并通过
log.SetOutput()切换目标 io.Writer; - 时间格式字符串必须使用 Go 的固定布局
"2006-01-02 15:04:05",不可更改——这是 Go 时间格式化的约定。
该方案简洁高效,避免了引入第三方 formatter 库的依赖,也优于简单正则替换(易出错、性能差),是定制 Logrus 文本日志格式的推荐实践。










