golang灵活日志调度过滤格式化插件库seelog的使用

Golang灵活日志调度过滤格式化插件库Seelog的使用

Seelog简介

Seelog是一个功能强大且易于学习的日志框架,提供了灵活的日志消息调度、过滤和格式化功能。它是用Go编程语言原生编写的。

Build Status

主要特性

  • 通过XML配置可以在不重新编译的情况下更改记录器参数
  • 无需重启应用程序即可动态更改配置
  • 可以为不同的项目文件和函数设置不同的日志配置
  • 可调整的消息格式
  • 同时将日志输出到多个流
  • 可选择记录器优先级策略以最小化性能影响
  • 不同的输出写入器:
    • 控制台写入器
    • 文件写入器
    • 缓冲写入器(块写入器)
    • 滚动日志写入器(带轮转的日志记录)
    • SMTP写入器
    • 其他…
  • 日志消息包装器(JSON、XML等)
  • 全局变量和函数,便于在独立应用程序中使用
  • 函数可在库中灵活使用

快速入门

package main

import log "github.com/cihub/seelog"

func main() {
    defer log.Flush()  // 确保在程序退出前刷新所有日志
    log.Info("Hello from Seelog!")  // 记录一条信息级别的日志
}

安装

如果尚未安装Go开发环境,请先安装Go。安装完成后执行以下命令:

go get -u github.com/cihub/seelog

完整示例

下面是一个更完整的Seelog使用示例,展示如何配置和使用不同的日志功能:

package main

import (
    "github.com/cihub/seelog"
    "time"
)

func main() {
    // 从XML字符串加载日志配置
    logger, err := seelog.LoggerFromConfigAsString(`
    <seelog minlevel="debug">
        <outputs formatid="common">
            <console />
            <file path="app.log" />
        </outputs>
        <formats>
            <format id="common" format="%Date %Time [%LEV] %Msg%n"/>
        </formats>
    </seelog>
    `)
    
    if err != nil {
        panic(err)
    }
    
    // 替换默认日志记录器
    seelog.ReplaceLogger(logger)
    defer seelog.Flush() // 确保在程序退出前刷新所有日志

    // 记录不同级别的日志
    seelog.Trace("This is a trace message")
    seelog.Debug("This is a debug message")
    seelog.Info("This is an info message")
    seelog.Warn("This is a warning message")
    seelog.Error("This is an error message")
    seelog.Critical("This is a critical message")

    // 使用格式化日志
    seelog.Infof("Current time is: %s", time.Now().Format(time.RFC3339))

    // 动态更改日志级别
    newLogger, _ := seelog.LoggerFromConfigAsString(`
    <seelog minlevel="error">
        <outputs formatid="common">
            <console />
        </outputs>
        <formats>
            <format id="common" format="%Date %Time [%LEV] %Msg%n"/>
        </formats>
    </seelog>
    `)
    seelog.ReplaceLogger(newLogger)
    
    seelog.Info("This info message won't be logged") // 不会被记录
    seelog.Error("This error message will be logged") // 会被记录
}

高级配置示例

以下是一个更高级的配置示例,展示Seelog的强大功能:

package main

import (
    "github.com/cihub/seelog"
    "os"
)

func initLogger() {
    // 更复杂的XML配置
    config := `
    <seelog minlevel="debug">
        <exceptions>
            <exception filepattern="special*.go" minlevel="error"/>
        </exceptions>
        <outputs>
            <filter levels="debug,info">
                <console formatid="debug"/>
                <file path="debug.log" formatid="debug"/>
            </filter>
            <filter levels="error,critical">
                <console formatid="error"/>
                <file path="error.log" formatid="error"/>
                <smtp formatid="criticalemail" senderaddress="logger@example.com" sendername="Logger" 
                    hostname="smtp.example.com" hostport="587" username="user" password="pass">
                    <recipient address="admin@example.com"/>
                </smtp>
            </filter>
        </outputs>
        <formats>
            <format id="debug" format="%Date %Time [%LEV] %RelFile:%Line %Msg%n"/>
            <format id="error" format="%Date %Time [%LEV] %FullPath %Func %Msg%n"/>
            <format id="criticalemail" format="Critical error on %Date %Time: %Msg"/>
        </formats>
    </seelog>
    `
    
    logger, err := seelog.LoggerFromConfigAsBytes([]byte(config))
    if err != nil {
        seelog.Critical("err parsing config log file", err)
        os.Exit(1)
    }
    seelog.ReplaceLogger(logger)
}

func main() {
    initLogger()
    defer seelog.Flush()

    // 这些日志会根据配置被路由到不同的输出
    seelog.Debug("Debug message")
    seelog.Info("Info message")
    seelog.Error("Error message")
    seelog.Critical("Critical error occurred!")
}

注意事项

  1. 确保在程序退出前调用Flush()方法,特别是在使用缓冲或异步日志记录时
  2. 可以通过ReplaceLogger()方法动态更改日志配置
  3. Seelog支持多种日志级别:Trace、Debug、Info、Warn、Error、Critical
  4. 可以使用格式化方法如Infof()Errorf()

Seelog提供了丰富的功能来满足各种日志记录需求,从简单的控制台输出到复杂的多目标、多级别日志路由。通过XML配置,可以轻松调整日志行为而无需重新编译代码。


更多关于golang灵活日志调度过滤格式化插件库seelog的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang灵活日志调度过滤格式化插件库seelog的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Seelog: Golang 灵活的日志调度、过滤与格式化插件库

Seelog 是一个功能强大的 Go 语言日志库,提供了灵活的日志调度、过滤和格式化功能。下面我将详细介绍 Seelog 的主要特性及使用方法。

核心特性

  1. 灵活的日志级别控制:支持 Trace、Debug、Info、Warn、Error 和 Critical 等级别
  2. 丰富的输出格式:支持 XML、JSON、Plaintext 等多种格式
  3. 多输出目标:可同时输出到控制台、文件、网络等
  4. 动态配置:支持运行时重新加载配置
  5. 强大的过滤功能:可按级别、模块、内容等条件过滤日志

安装

go get github.com/cihub/seelog

基础使用示例

package main

import (
    "github.com/cihub/seelog"
)

func main() {
    defer seelog.Flush()
    
    seelog.Info("这是一条普通信息日志")
    seelog.Debug("调试信息")
    seelog.Warn("警告信息")
    seelog.Error("错误信息")
}

配置示例

Seelog 的强大之处在于其灵活的配置能力。下面是一个典型的配置文件示例(通常保存为 seelog.xml):

<seelog minlevel="info">
    <outputs formatid="common">
        <console />
        <rollingfile type="date" filename="logs/app.log" datepattern="2006-01-02" maxrolls="7"/>
    </outputs>
    <formats>
        <format id="common" format="%Date %Time [%LEVEL] %Msg%n"/>
        <format id="debug" format="%Date %Time [%LEVEL] [%File:%Line] %Msg%n"/>
    </formats>
</seelog>

加载配置文件:

logger, err := seelog.LoggerFromConfigAsFile("seelog.xml")
if err != nil {
    panic(err)
}
seelog.ReplaceLogger(logger)
defer seelog.Flush()

高级功能

1. 动态修改日志级别

// 获取当前配置
currentConfig := seelog.Current.Config()
// 修改配置
newConfig := strings.Replace(currentConfig, `minlevel="info"`, `minlevel="debug"`, 1)
// 重新加载
newLogger, err := seelog.LoggerFromConfigAsBytes([]byte(newConfig))
if err != nil {
    seelog.Error("加载新配置失败:", err)
} else {
    seelog.ReplaceLogger(newLogger)
}

2. 自定义格式

customFormatter := func(message string, level seelog.LogLevel, context seelog.LogContextInterface) interface{} {
    return fmt.Sprintf("[%s] %s:%d - %s", 
        level.String(), 
        context.Func(), 
        context.Line(), 
        message)
}

logger, err := seelog.LoggerFromCustomReceiver(&seelog.CustomReceiver{
    Formatter: customFormatter,
    Writer:    os.Stdout,
})

3. 条件过滤

<seelog>
    <outputs>
        <filter levels="error,critical">
            <console />
        </filter>
        <filter levels="info,warn">
            <file path="logs/info.log" />
        </filter>
    </outputs>
</seelog>

4. 异步日志

asyncLogger, err := seelog.LoggerFromConfigAsString(`
<seelog asyncinterval="1000">
    <outputs>
        <console />
    </outputs>
</seelog>
`)

性能考虑

  1. 异步日志:对于高性能应用,使用异步日志避免阻塞主线程
  2. 级别控制:生产环境适当提高最小日志级别
  3. 缓冲设置:合理设置缓冲大小平衡性能与实时性

最佳实践

  1. 在 main 函数开始时初始化日志系统
  2. 使用 defer seelog.Flush() 确保日志被刷新
  3. 为不同环境准备不同的配置文件
  4. 对敏感信息进行脱敏处理

Seelog 提供了企业级应用所需的所有日志功能,通过合理的配置可以满足从开发调试到生产环境的各种日志需求。其灵活的配置系统和丰富的功能使其成为 Go 生态中优秀的日志解决方案之一。

回到顶部