golang-seelog
项目中有使用seelog包进行日志处理,所以特意花点时间使用及通读seelog的wiki所有文档,先做笔记如下:
一. seelog主要功能
- 设置不同日志级别(trace, debug, info, warn, error, critical, off)
- 输出到终端(可基于日志级别设置不同颜色显示)和磁盘文件
- 过滤指定级别日志
- 定义多种日志输出格式
- 根据文件或者函数进行日志输出
- 通过 SMTP 或者 TCP 转发日志
- 滚动日志文件(基于日期或者指定文件大小进行切割日志,并能自动删除"过期"日志文件)
二. 项目对日志的需求
- 能设置不同日志级别(满足)
- 能将日志输出到终端且同时输出到磁盘文件(满足)
- 能对日志进行切割,能基于日期或者指定日志文件大小进行日志切割(满足)
- (我的需求) 能在控制台对不同级别的日志以颜色加以区分(满足)
三. 简单实用seelog
- 无日志配置文件的Demo
1 package main 2 3 import ( 4 log "github.com/cihub/seelog" 5 ) 6 7 func main() { 8 defer log.Flush() 9 log.Info("hello world") 10 }
- 有日志配置文件的Demo
1 package main 2 3 import ( 4 log "github.com/cihub/seelog" 5 ) 6 7 func SetupLogger() { 8 defer log.Flush() 9 10 // 加载日志配置文件 11 logger, err := log.LoggerFromConfigAsFile("seelog.xml") 12 if err != nil { 13 return 14 } 15 16 // 替换日志 17 log.ReplaceLogger(logger) 18 19 log.Info("hello world) 20 }
四. seelog配置文件
- 解读seelog官网配置文件
1 <!-- 2 1. type: 日志输出类型,有4中类型,分别是:sync,asyncloop(default),asynctimer,adaptive 3 type=“sync”:在同一个go中处理日志消息,仅当调用日志函数时才被执行。 4 type=“asyncloop”:在单独的go中独自处理日志消息,循环从日志队列中读取日志并消费(输出到控制台或者文件)。 5 type="asynctimer":在单独的go中独自处理日志消息,在指定时间间隔去读取日志队列消息,所以该类型还需要配置一个间隔时间(纳秒)。 6 type="adaptive":在单独的go中独自处理日志消息,但是不是固定的每隔指定时间去读取日志消息,间隔时间与队列剩余的日志量有关,如果剩余日志量多,则间隔时间短,反之亦然 7 2. minlevel: 全局最低输出日志级别 8 3. maxlevel: 全局最高输出日志级别 9 4. exceptions: 日志的特殊处理情况,可根据指定文件或者函数进行日志输出 10 5. formatid: 输出格式标签,可以在formats中找到对应的标签 11 6. console: 将日志输出到控制台 12 7. splitter: 用于细分outputs日志格式,支持: file(文件), rollingfile(滚动文件), buffered(缓存到内存再输出到文件), smtp(发送日志邮件), con(网络转发) 13 8. rollingfile: 滚动文件,可基于日期(type="date")或者文件大小(type="size")进行日志切割,maxsize: 单个日志文件最大size,如果设置为100M,则maxsize=100*1024*1024,maxrolls: 最大文件数量,超出的日志文件数量会被滚动删除 14 9. buffered: 将日志先存在内存中,定期写入文件,适合日志并发量较大或 IO 比较紧张的场合,size:缓存大小, flushperiod:缓存时间 15 10. filter: 单独处理某级别的日志 16 11. formats: 日志输出格式 17 --> 18 <seelog type="asynctimer" asyncinterval="5000000" minlevel="debug" maxlevel="error"> 19 <exceptions> 20 <exception funcpattern="*main.test*Something*" minlevel="info"/> 21 <exception filepattern="*main.go" minlevel="error"/> 22 </exceptions> 23 <outputs formatid="main"> 24 <console/> 25 26 <splitter formatid="format1"> 27 <file path="log.log"/> 28 <file path="log2.log"/> 29 </splitter> 30 <splitter formatid="format2"> 31 <file path="log3.log"/> 32 <file path="log4.log"/> 33 </splitter> 34 35 <rollingfile formatid="someformat" type="size" filename="./log/roll.log" maxsize="100" maxrolls="5" /> 36 37 <buffered formatid="testlevels" size="10000" flushperiod="1000"> 38 <file path="./log/bufFileFlush.log"/> 39 </buffered> 40 41 <filter levels="error"> 42 <file path="./log/error.log"/> 43 <smtp senderaddress="noreply-notification-service@none.org" 44 sendername="Automatic notification service" 45 hostname="mail.none.org" 46 hostport="587" 47 username="nns" 48 password="123"> 49 <recipient address="john-smith@none.com"/> 50 <recipient address="hans-meier@none.com"/> 51 </smtp> 52 <conn net="tcp4" addr="server.address:5514" tls="true" insecureskipverify="true" /> 53 </filter> 54 55 </outputs> 56 <formats> 57 <format id="main" format="%Date(2006 Jan 02/3:04:05.000000000 PM MST) [%Level] %Msg%n"/> 58 <format id="someformat" format="%Ns [%Level] %Msg%n"/> 59 <format id="testlevels" format="%Level %Lev %LEVEL %LEV %l %Msg%n"/> 60 <format id="usetags" format="<msg>%Msg</time>"/> 61 <format id="format1" format="%Date/%Time [%LEV] %Msg%n"/> 62 <format id="format2" format="%File %FullPath %RelFile %Msg%n"/> 63 </formats> 64 </seelog>
- 我测试时的seelog配置文件
1 <seelog levels="trace,debug,info,warn,error,critical"> 2 <outputs formatid="main"> 3 <!-- 对控制台输出的Log按级别分别用颜色显示。6种日志级别我仅分了三组颜色,如果想每个级别都用不同颜色则需要简单修改即可 --> 4 <filter levels="trace,debug,info"> 5 <console formatid="colored-default"/> 6 </filter> 7 <filter levels="warn"> 8 <console formatid="colored-warn"/> 9 </filter> 10 <filter levels="error,critical"> 11 <console formatid="colored-error"/> 12 </filter> 13 14 <!-- 将日志输出到磁盘文件,按文件大小进行切割日志,单个文件最大100M,最多5个日志文件 --> 15 <rollingfile formatid="main" type="size" filename="./log/default.log" maxsize="104857600" maxrolls="5" /> 16 </outputs> 17 <formats> 18 <format id="colored-default" format="%EscM(38)%Date %Time [%LEV] %File:%Line | %Msg%n%EscM(0)"/> 19 <format id="colored-warn" format="%EscM(33)%Date %Time [%LEV] %File:%Line | %Msg%n%EscM(0)"/> 20 <format id="colored-error" format="%EscM(31)%Date %Time [%LEV] %File:%Line | %Msg%n%EscM(0)"/> 21 <format id="main" format="%Date %Time [%LEV] %File:%Line | %Msg%n"/> 22 </formats> 23 </seelog>
五. seelog测试
- golang main.go
1 package main 2 3 import ( 4 log "github.com/cihub/seelog" 5 ) 6 7 func main() { 8 defer log.Flush() 9 10 logger, err := log.LoggerFromConfigAsFile("config.xml") 11 if err != nil { 12 log.Errorf("parse config.xml error: %v", err) 13 return 14 } 15 16 log.ReplaceLogger(logger) 17 18 log.Info("seelog test begin") 19 20 for i := 0; i < 1; i++ { 21 log.Tracef("hello seelog trace, i = %d", i) 22 log.Debugf("hello seelog debug, i = %d", i) 23 log.Infof("hello seelog info, i = %d", i) 24 log.Warnf("hello seelog warn, i = %d", i) 25 log.Errorf("hello seelog error, i = %d", i) 26 log.Criticalf("hello seelog critical, i = %d", i) 27 } 28 29 log.Debug("seelog test end") 30 }
- 输出
六. 参考文件
1. seelog 源码:https://github.com/cihub/seelog
2. seelog wiki 文档:https://github.com/cihub/seelog/wiki
3. seelog 日志控制台带颜色输出中的颜色配置:https://en.wikipedia.org/wiki/ANSI_escape_code