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 }
View Code
  • 有日志配置文件的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 }
View Code

四. 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="&lt;msg&gt;%Msg&lt;/time&gt;"/>
61         <format id="format1" format="%Date/%Time [%LEV] %Msg%n"/>
62         <format id="format2" format="%File %FullPath %RelFile %Msg%n"/>
63     </formats>
64 </seelog>
View Code
  • 我测试时的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>
View Code

五. 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 }
View Code
  • 输出

 

六. 参考文件

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

 

posted @ 2018-10-24 16:36  hezhixiong  阅读(1440)  评论(0编辑  收藏