登录
首页 >  Golang >  Go教程

Golang的log库日志分级怎么做 自定义输出格式与目标

时间:2025-10-17 12:39:14 305浏览 收藏

珍惜时间,勤奋学习!今天给大家带来《Golang的log库日志分级怎么做 自定义输出格式与目标》,正文内容主要涉及到等等,如果你正在学习Golang,或者是对Golang有疑问,欢迎大家关注我!后面我会持续更新相关内容的,希望都能帮到正在学习的大家!

Go标准库log不支持分级,推荐使用logrus或zap实现分级与结构化输出,或通过封装标准库自定义分级日志,结合输出目标与格式控制。

Golang的log库日志分级怎么做 自定义输出格式与目标

Go语言标准库中的log包本身不支持日志分级(如debug、info、warn、error等),它只提供基础的打印功能,且输出格式和目标较为固定。如果需要实现日志分级、自定义格式和输出目标,有以下两种常见做法:使用第三方库或自行封装。

1. 使用第三方库(推荐)

最常用的是 logruszap,它们支持日志分级、结构化输出、自定义格式和多目标输出。

以 logrus 为例:

安装:
go get github.com/sirupsen/logrus

示例代码:

package main

import (
    "os"
    "github.com/sirupsen/logrus"
)

func main() {
    // 设置日志格式为JSON(也可用TextFormatter)
    logrus.SetFormatter(&logrus.TextFormatter{
        FullTimestamp: true,
    })

    // 设置输出目标,例如写入文件
    file, _ := os.OpenFile("app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
    logrus.SetOutput(file)

    // 也可以同时输出到控制台和文件(使用 io.MultiWriter)

    // 使用不同级别
    logrus.Debug("这是一条调试日志")
    logrus.Info("这是一条信息日志")
    logrus.Warn("这是一条警告日志")
    logrus.Error("这是一条错误日志")
}
logrus 支持的日志级别从低到高为:DebugInfoWarnErrorPanicFatal。可通过 logrus.SetLevel(logrus.DebugLevel) 控制输出级别。

2. 自定义封装标准 log 包

若不想引入第三方依赖,可基于标准库 log 封装一个支持分级的日志模块。

示例:

package main

import (
    "log"
    "os"
)

var (
    debugLog = log.New(os.Stdout, "DEBUG: ", log.LstdFlags|log.Lshortfile)
    infoLog  = log.New(os.Stdout, "INFO: ", log.LstdFlags|log.Lshortfile)
    warnLog  = log.New(os.Stdout, "WARN: ", log.LstdFlags|log.Lshortfile)
    errorLog = log.New(os.Stderr, "ERROR: ", log.LstdFlags|log.Lshortfile)
)

const (
    LogLevelDebug = iota
    LogLevelInfo
    LogLevelWarn
    LogLevelError
)

var logLevel = LogLevelInfo // 当前日志级别

func Debug(v ...interface{}) {
    if logLevel <= LogLevelDebug {
        debugLog.Println(v...)
    }
}

func Info(v ...interface{}) {
    if logLevel <= LogLevelInfo {
        infoLog.Println(v...)
    }
}

func Warn(v ...interface{}) {
    if logLevel <= LogLevelWarn {
        warnLog.Println(v...)
    }
}

func Error(v ...interface{}) {
    errorLog.Println(v...)
}

func main() {
    Debug("这不会输出,因为当前级别是 Info")
    Info("这是一条信息")
    Warn("这是一条警告")
    Error("这是一条错误")
}
你可以将输出目标改为文件,例如:
file, _ := os.OpenFile("app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
debugLog.SetOutput(file)
infoLog.SetOutput(file)
// ...其他类似
也可以组合输出到多个目标:
multiWriter := io.MultiWriter(os.Stdout, file)
infoLog.SetOutput(multiWriter)

3. 自定义日志格式

标准库 log 的格式由标志位控制,如:
  • log.Ldate:输出日期
  • log.Ltime:输出时间
  • log.Lmicroseconds:精确到微秒
  • log.Llongfile:完整文件名和行号
  • log.Lshortfile:仅文件名和行号
  • log.LUTC:使用UTC时间
组合使用:
log.New(os.Stdout, "PREFIX: ", log.LstdFlags|log.Lshortfile)
若需更灵活的格式(如JSON),建议使用 logrus 或 zap。 基本上就这些。标准库 log 简单但功能有限,生产项目推荐使用 logrus 或 zap 实现分级、结构化和灵活输出。

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

相关阅读
更多>
最新阅读
更多>
课程推荐
更多>