
本文介绍如何通过自定义 Logrus Formatter,将默认带键值对(如 time="..." level=error msg="...")的日志格式,改为类似标准错误输出的简洁纯文本格式(如 ERRO 2006-01-02 15:04:05 message),适用于文件日志场景。
本文介绍如何通过自定义 logrus formatter,将默认带键值对(如 `time="..." level=error msg="..."`)的日志格式,改为类似标准错误输出的简洁纯文本格式(如 `erro 2006-01-02 15:04:05 message`),适用于文件日志场景。
Logrus 默认使用 TextFormatter,其输出为结构化键值对(如 level=error msg="..." time="..."),便于解析但不够简洁。若需类比 stderr 终端输出的紧凑风格(如 ERRO 2006-01-02 15:04:05 message),需实现自定义 Formatter 接口,覆盖 Format() 方法。
以下是一个轻量、可复用的 PlainFormatter 实现:
package main
import (
"fmt"
log "github.com/sirupsen/logrus"
"os"
)
type PlainFormatter struct {
TimestampFormat string
LevelDesc []string
}
func (f *PlainFormatter) Format(entry *log.Entry) ([]byte, error) {
// 映射 logrus Level 到简写字符串(注意索引顺序必须与 log.Level 枚举一致)
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() {
// 初始化 formatter,支持自定义时间格式和日志级别缩写
plainFormatter := &PlainFormatter{
TimestampFormat: "2006-01-02 15:04:05",
LevelDesc: []string{
"PANC", // Panic
"FATL", // Fatal
"ERRO", // Error
"WARN", // Warn
"INFO", // Info
"DEBG", // Debug
},
}
// 设置全局 formatter
log.SetFormatter(plainFormatter)
// 【关键】若需输出到文件而非 stdout,请显式设置输出目标
file, err := os.OpenFile("app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
if err != nil {
log.Fatal("Failed to open log file: ", err)
}
defer file.Close()
log.SetOutput(file)
// 日志调用示例
log.Errorln("Not fatal. An error. Won't stop execution")
log.Infoln("Just some info")
}运行后,app.log 中将生成如下纯文本日志:
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切片顺序必须严格对应logrus.Level的整数值(PanicLevel=0,FatalLevel=1, ...,DebugLevel=5),否则级别显示错位; - 若需保留
Fields(如log.WithField("user_id", 123)),当前PlainFormatter未处理——如需支持,应在Format()中遍历entry.Data并拼接,但会偏离“无字段名”的原始目标; - 生产环境建议搭配
log.SetReportCaller(true)和log.SetLevel(log.InfoLevel)进行日志分级控制; - 此方案完全兼容文件输出,只需通过
log.SetOutput()指向*os.File即可,无需修改 formatter 逻辑。
该方式灵活、低侵入,是定制 Logrus 输出格式的标准实践。

















