seelog学习笔记 - Go语言中文社区

seelog学习笔记


之前用了beego内置的日志模块 beego框架-logs模块学习笔记 ,起初的时候用的还凑活,不过随着项目中日志量的增大,慢慢的发现beego内置的日志库已经完全不能满足日常需求。最后打算使用 seelog ,但是似乎从2017年以后seelog不再有人维护。以下就简单说一下使用seelog的过程。

一、seelog

1、功能

  • 设置不同日志级别(trace, debug, info, warn, error, critical, off)
  • 输出到终端(可基于日志级别设置不同颜色显示)和磁盘文件
  • 过滤指定级别日志
  • 定义多种日志输出格式
  • 根据文件或者函数进行日志输出
  • 通过 SMTP 或者 TCP 转发日志
  • 滚动日志文件(基于日期或者指定文件大小进行切割日志,并能自动删除"过期"日志文件)

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="&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>

以下是我简单的配置示例,配置文件:

<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提供了相对比较详细的文档

二、其他

以下是在项目中封装的日志模块,实现了文件滚动存储,日志级别定义,最大文件大小限制的功能,目前还缺一个实时更新日志级别的功能,后面有时间补上。 源码链接
在这里插入图片描述

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_30549833/article/details/90718554
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2019-08-27 19:15:41
  • 阅读 ( 1502 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

推荐文章

猜你喜欢