Go中seelog日志包

  1. 介绍
    在Go中,seelog是比较有名的日志处理包,功能也比较强大。
  2. seelog包的引用
import "github.com/cihub/seelog"
  1. 使用
package main

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

func main() {
    defer log.Flush()
    log.Info("Hello from Seelog!")
}
  1. 也可以用xml来配置日志
    官方配置说明
<!-- type 设置记录器类型 https://github.com/cihub/seelog/wiki/Logger-types-reference
minlevel 设置日志最低级别; maxlevel 设置日志的最高级别
也可以通过 <seelog levels="trace,info,critical"> 设置日记级别 -->
<seelog type="asynctimer" asyncinterval="5000000" minlevel="debug" maxlevel="error">
    <exceptions>
        <!-- <exception> 是为特定的程序文件(filepattern)或函数(funcpattern)设定特殊的日志规则 -->
        <exception funcpattern="*main.test*Something*" minlevel="info"/>
        <exception filepattern="*main.go" minlevel="error"/>
    </exceptions>

    <!-- <outputs> formatid 指定日志输出的格式(格式在<formats>标签中定义) -->
    <outputs formatid="main">
        <!-- <console> 标签表示输出到终端 -->
        <console/>

        <!-- <splitter> 用于细分<outputs>日志格式,内部支持:file(文件), rollingfile(滚动文件,自动清除过期),
        buffered(日志写到内存再写到文件), smtp(发送日志到邮件), con(网络转发) -->
        <splitter formatid="format1">
            <!-- log.log, log2.log将按<formats>标签中的id="format1"格式写入 -->
            <file path="log.log"/>
            <file path="log2.log"/>
        </splitter>
        <splitter formatid="format2">
            <file path="log3.log"/>
            <file path="log4.log"/>
        </splitter>

        <!-- <rollingfile>滚动文件(定期清除过期日志)
        formatid: 指定日志格式; type="size" 按大小; maxsize: 单日志文件最大大小; maxrools: 最大文件数 -->
        <rollingfile formatid="someformat" type="size" filename="./log/roll.log" maxsize="100" maxrolls="5" />

        <!-- <buffered> 将日志先存在内存中,定期写入文件,适合日志并发量较大或 IO 比较紧张的场合
        size: 缓存大小; flushperiod: 缓存间隔(毫秒) -->
        <buffered formatid="testlevels" size="10000" flushperiod="1000">
            <file path="./log/bufFileFlush.log"/>
        </buffered>

        <!-- <filter>用于单独处理某级别日志
        过滤日志,把级别是error的通过邮件smtp方式发送出去(一般会发给相应的运维人员) -->
        <filter levels="error">
            <file path="./log/error.log"/>
            <smtp senderaddress="noreply-notification-service@none.org" 
                  sendername="Automatic notification service" 
                  hostname="mail.none.org" 
                  hostport="587" 
                  username="nns" 
                  password="123">
                <recipient address="john-smith@none.com"/>
                <recipient address="hans-meier@none.com"/>
            </smtp>
            <!-- 按tcp4网络协议发送日志 -->
            <conn net="tcp4" addr="server.address:5514" tls="true" insecureskipverify="true" />
        </filter>

    </outputs>

    <!-- <formats> 定制日志的输出格式
    https://github.com/cihub/seelog/wiki/Format-reference -->
    <formats>
        <format id="main" format="%Date(2006 Jan 02/3:04:05.000000000 PM MST) [%Level] %Msg%n"/>
        <format id="someformat" format="%Ns [%Level] %Msg%n"/>
        <format id="testlevels" format="%Level %Lev %LEVEL %LEV %l %Msg%n"/>
        <format id="usetags" format="&lt;msg&gt;%Msg&lt;/time&gt;"/>
        <format id="format1" format="%Date/%Time [%LEV] %Msg%n"/>
        <format id="format2" format="%File %FullPath %RelFile %Msg%n"/>
    </formats>
</seelog>
  1. 使用配置
import (
    log "github.com/cihub/seelog"
)

func SetupLogger() {
    logger, err := log.LoggerFromConfigAsFile("seelog.xml")
    if err != nil {
        return
    }

    log.ReplaceLogger(logger)
}
  1. 封装的一个seelog包
/**
* File:log.go
* Copyright: Copyright (c) 2019
* Created on 2019-11-11
* Author:zengwu
* Version 1.0
* Title: 日志类
 */
package log

import (
    "fmt"
    "github.com/cihub/seelog"
    "os"
    "path/filepath"
    "runtime"
    "strings"
)

// 输入日志的标签
var showTag map[string]bool
var logFolder string

// 初始化日志
// tags 显示的tag
func Init(tags []string) {
    // 获取程序运行文件路径
    dir, file := filepath.Split(os.Args[0])
    logFolder = dir + "/logs/"

    // 配置日志文件,运行文件所在目录/logs/文件名
    fileCfg := strings.Replace(fileConfig, "./logs/log", logFolder+file, -1)
    logger, _ := seelog.LoggerFromConfigAsString(fileCfg)
    err := seelog.ReplaceLogger(logger)
    if err != nil {
        fmt.Println("log init error.", err)
    }

    // 根据配置显示tag
    showTag = make(map[string]bool)
    for _, tag := range tags {
        showTag[tag] = true
    }
}

// 重新设置显示标志
func ReplaceShowTag(tags []string) {
    showTag = make(map[string]bool)
    for _, tag := range tags {
        showTag[tag] = true
    }
}

// 输出日志
func Trace(tag string, v ...interface{}) {
    if showTag != nil {
        if _, ok := showTag[tag]; !ok {
            return
        }
    }

    seelog.Trace("- [Tag:"+tag+"] ", v)
}

// 输出错误日志
func Error(v ...interface{}) {
    pc, filename, line, _ := runtime.Caller(1)
    funcName := runtime.FuncForPC(pc).Name()
    caller := fmt.Sprintf("- [%s:%d - %s] ", filename, line, funcName)
    _ = seelog.Error(caller, v)
}

var fileConfig = `
<!-- type 设置记录器类型 https://github.com/cihub/seelog/wiki/Logger-types-referenceminlevel 设置日志最低级别; 
maxlevel 设置日志的最高级别也可以通过 <seelog levels="trace,info,critical"> 设置日记级别 -->
<seelog type="asynctimer" asyncinterval="5000000" minlevel="trace" maxlevel="error">
    <!-- <outputs> formatid 指定日志输出的格式(格式在<formats>标签中定义) -->
    <outputs formatid="trace">
        <filter levels="trace,info,debug">
            <!-- <console> 标签表示输出到终端 -->
            <console formatid="colored" />
            <!-- <rollingfile>滚动文件(定期清除过期日志) formatid: 指定日志格式; type="size/date" 按大小/按日期; maxsize: 单日志文件最大大小; maxrools: 最大文件数 -->
            <rollingfile formatid="trace" type="date" filename="./logs/log.info" datepattern="2006-01-02" fullname="true" maxrolls="5"/>
        </filter>
        <filter levels="error,warn">
            <console formatid="coloredErr" />
            <rollingfile formatid="trace" type="date" filename="./logs/log.err" datepattern="2006-01-02" fullname="true" maxrolls="30"/>
        </filter>
    </outputs>

    <formats>
         <!-- <formats> 定制日志的输出格式https://github.com/cihub/seelog/wiki/Format-reference -->
        <format id="trace" format="%Date(2006-01-02 15:04:05.000) [%LEVEL] %Msg%n" />
        <format id="err" format="%Date(2006-01-02 15:04:05.000) [%LEVEL] [%File:%Line-%Func] %Msg%n" />
        <format id="colored" format="%Date(2006-01-02 15:04:05.000) %EscM(42)[%LEVEL]%EscM(49) %Msg%n%EscM(0)" />
        <format id="coloredErr" format="%Date(2006-01-02 15:04:05.000) %EscM(41)[%LEVEL]%EscM(49) [%File:%Line-%Func] %Msg%n%EscM(0)"/>
    </formats>
</seelog>
`

使用

package main

import (
    "github.com/zngw/log"
)

func main() {
    // 初始化日志
    log.Init([]string{"sys","net"})

    // 输出日志: 2019-11-15 01:06:01.215 [TRACE] - [Tag:sys] [Hello World]
    log.Trace("sys","Hello World")

    // 输出日志: 2019-11-15 01:06:01.215 [TRACE] - [Tag:net] [Hello Golang]
    log.Trace("net","Hello Golang")

    // 这条日志不在显示的tag内,故不输出
    log.Trace("test","Hello zngw")

    // 输出错误日志: 2019-11-15 01:06:01.215 [ERROR] [log.go:71-github.com/zngw/log.Error] - [F:/work/src/github.com/main.go:15 - main.main] [Error]
    log.Error("Error")
}
0%