社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
之前用了beego内置的日志模块 beego框架-logs模块学习笔记 ,起初的时候用的还凑活,不过随着项目中日志量的增大,慢慢的发现beego内置的日志库已经完全不能满足日常需求。最后打算使用 seelog ,但是似乎从2017年以后seelog不再有人维护。以下就简单说一下使用seelog的过程。
1、功能
2、使用
1)无配置使用
无配置使用比较简单,下面示例中只使用了info
,这种是没有格式化的。需要格式化输出的应该使用infof
package main
import (
log "github.com/cihub/seelog"
)
func main() {
defer log.Flush()
log.Info("hello world")
}
2)有配置使用
通过配置文件来创建seelog的日志对象,实现自己不同的需求(写日志到控制台、磁盘、stmp、tcp…,控制日志的级别、不同级别日志的颜色…),详细信息见 官方配置说明 。以下为中文的解释,可作为参考。
<!--
1. type: 日志输出类型,有4中类型,分别是:sync,asyncloop(default),asynctimer,adaptive
type=“sync”:在同一个go中处理日志消息,仅当调用日志函数时才被执行。
type=“asyncloop”:在单独的go中独自处理日志消息,循环从日志队列中读取日志并消费(输出到控制台或者文件)。
type="asynctimer":在单独的go中独自处理日志消息,在指定时间间隔去读取日志队列消息,所以该类型还需要配置一个间隔时间(纳秒)。
type="adaptive":在单独的go中独自处理日志消息,但是不是固定的每隔指定时间去读取日志消息,间隔时间与队列剩余的日志量有关,如果剩余日志量多,则间隔时间短,反之亦然
2. minlevel: 全局最低输出日志级别
3. maxlevel: 全局最高输出日志级别
4. exceptions: 日志的特殊处理情况,可根据指定文件或者函数进行日志输出
5. formatid: 输出格式标签,可以在formats中找到对应的标签
6. console: 将日志输出到控制台
7. splitter: 用于细分outputs日志格式,支持: file(文件), rollingfile(滚动文件), buffered(缓存到内存再输出到文件), smtp(发送日志邮件), con(网络转发)
8. rollingfile: 滚动文件,可基于日期(type="date")或者文件大小(type="size")进行日志切割,maxsize: 单个日志文件最大size,如果设置为100M,则maxsize=100*1024*1024,maxrolls: 最大文件数量,超出的日志文件数量会被滚动删除
9. buffered: 将日志先存在内存中,定期写入文件,适合日志并发量较大或 IO 比较紧张的场合,size:缓存大小, flushperiod:缓存时间
10. filter: 单独处理某级别的日志
11. formats: 日志输出格式
-->
<seelog type="asynctimer" asyncinterval="5000000" minlevel="debug" maxlevel="error">
<exceptions>
<exception funcpattern="*main.test*Something*" minlevel="info"/>
<exception filepattern="*main.go" minlevel="error"/>
</exceptions>
<outputs formatid="main">
<console/>
<splitter formatid="format1">
<file path="log.log"/>
<file path="log2.log"/>
</splitter>
<splitter formatid="format2">
<file path="log3.log"/>
<file path="log4.log"/>
</splitter>
<rollingfile formatid="someformat" type="size" filename="./log/roll.log" maxsize="100" maxrolls="5" />
<buffered formatid="testlevels" size="10000" flushperiod="1000">
<file path="./log/bufFileFlush.log"/>
</buffered>
<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>
<conn net="tcp4" addr="server.address:5514" tls="true" insecureskipverify="true" />
</filter>
</outputs>
<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>
以下是我简单的配置示例,配置文件:
<seelog levels="trace,debug,info,warn,error,critical">
<outputs formatid="main">
<!-- 对控制台输出的Log按级别分别用颜色显示。6种日志级别我仅分了三组颜色,如果想每个级别都用不同颜色则需要简单修改即可 -->
<filter levels="trace,debug,info">
<console formatid="colored-default"/>
</filter>
<filter levels="warn">
<console formatid="colored-warn"/>
</filter>
<filter levels="error,critical">
<console formatid="colored-error"/>
</filter>
<!-- 将日志输出到磁盘文件,按文件大小进行切割日志,单个文件最大100M,最多5个日志文件 -->
<rollingfile formatid="main" type="size" filename="./log/default.log" maxsize="104857600" maxrolls="5" />
</outputs>
<formats>
<format id="colored-default" format="%Date %Time [%LEV] %File:%Line | %Msg%n"/>
<format id="colored-warn" format="%Date %Time [%LEV] %File:%Line | %Msg%n"/>
<format id="colored-error" format="%Date %Time [%LEV] %File:%Line | %Msg%n"/>
<format id="main" format="%Date %Time [%LEV] %File:%Line | %Msg%n"/>
</formats>
</seelog>
代码:
package main
import (
log "github.com/cihub/seelog"
)
func main() {
//defer log.Flush()
logger, err := log.LoggerFromConfigAsFile("c:/config.xml")
if err != nil {
log.Errorf("parse config.xml error: %v", err)
return
}
log.ReplaceLogger(logger)
logger.Info("seelog test begin")
for i := 0; i < 1; i++ {
logger.Trace("dddddddddddddddddddd")
logger.Tracef("hello seelog trace, i = %d", i)
logger.Debug("aaaaaaaa %d", 1)
logger.Debugf("hello seelog debug, i = %d", i)
logger.Infof("hello seelog info, i = %d", i)
logger.Warnf("hello seelog warn, i = %d", i)
logger.Errorf("hello seelog error, i = %d", i)
logger.Criticalf("hello seelog critical, i = %d", i)
}
logger.Debug("seelog test end")
log.Flush()
}
结果:
发现:
a.需要格式化时必须使用Debugf函数(带f结尾的函数),这个是重点,因为和其他的日志有点不一样。
b.在windows平台下日志的颜色有点问题,不能正确显示,linux是可以的
c.可以根据不同的需要,使用不同的方式初始化seelog对象。使用文件初始化:LoggerFromConfigAsFile
、使用内存初始化LoggerFromConfigAsBytes
等等。
seelog提供了相对比较详细的文档。
以下是在项目中封装的日志模块,实现了文件滚动存储,日志级别定义,最大文件大小限制的功能,目前还缺一个实时更新日志级别的功能,后面有时间补上。 源码链接
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!