• 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

      另外,自己搞了个写论文的工具,可以爬取论文,添加索引及支持论文查重等功能。
      网站地址:https://www.essaytool.com

  • 相关阅读:
    linux学习(一)
    Linux学习(用户管理)
    anyproxy mac安装
    python mitmproxy 代理
    Js常用方法map, sort
    echarts常用配置项【持续更新】
    【转】moment js 使用
    js Cannot assign to read only property 'exports' of object '#<Object>' at Modul,import 与module.exports混用问题
    a标签跳转referer漏洞
    element ui rate评分组建使用
  • 原文地址:https://www.cnblogs.com/hezhixiong/p/9844309.html
Copyright © 2020-2023  润新知