- 介绍
在Go中,seelog是比较有名的日志处理包,功能也比较强大。 - seelog包的引用
import "github.com/cihub/seelog"
- 使用
package main
import (
log "github.com/cihub/seelog"
)
func main() {
defer log.Flush()
log.Info("Hello from Seelog!")
}
- 也可以用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="<msg>%Msg</time>"/>
<format id="format1" format="%Date/%Time [%LEV] %Msg%n"/>
<format id="format2" format="%File %FullPath %RelFile %Msg%n"/>
</formats>
</seelog>
- 使用配置
import (
log "github.com/cihub/seelog"
)
func SetupLogger() {
logger, err := log.LoggerFromConfigAsFile("seelog.xml")
if err != nil {
return
}
log.ReplaceLogger(logger)
}
- 封装的一个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")
}