golang日志包logger的用法详解


Posted in Golang onMay 05, 2021

1. logger包介绍

import  "github.com/wonderivan/logger"

在我们开发go程序的过程中,发现记录程序日志已经不是fmt.print这么简单,我们想到的是打印输出能够明确指定当时运行时间、运行代码段,当然我们可以引入go官方自带包 import “log”,然后通过log.Printf、log.Println等方式输出,而且默认是日志输出时只带时间的,想要同时输出所运行代码段位置,还需要通过执行一下指定进行相关简单的设置

log.SetFlags(log.LstdFlags | log.Lshortfile)
log.SetPrefix(xxx)

然而logger要做的并不仅仅是要这些:

logger支持自定义时间格式

logger支持不同的日志等级输出,能够有效提高日志输出性能和检索;

logger支持控制台+文件+网络的三种方式输出,并且可以任意组合。

logger支持控制台输出颜色区分;

logger支持文本输出的自定制;

logger支持网络日志传输,例如直连logstash发送。

2. logger包使用

logger包使用起来非常方便,很多配置参数都有其默认值,符合通常使用习惯。如果仅需要在控制台输出,则只需要引入该包,然后直接使用即可:

package main 
import "github.com/wonderivan/logger" 
func main() {
 logger.Trace("this is Trace") // 由于默认输出,只会在控制台输出Debug及其以上日志,所以该条不会输出
 logger.Debug("this is Debug")
 logger.Info("this is Info")
 logger.Warn("this is Warn")
 logger.Error("this is Error")
 logger.Crit("this is Critical")
 logger.Alert("this is Alert")
 logger.Emer("this is Emergency")
}

此时在终端即可输出(如果是非windows终端,支持日志等级颜色区分):

golang日志包logger的用法详解

3. logger详细介绍

在上边介绍了logger的基本使用后,接下来详细介绍一下该包的文本输出和网络输出,及其相关配置项。

3.1 日志等级

当前日志输出等级共8种,从0-7对应的等级由高到底,可以通过配置参数进行配置,默认为DEBG级别,当配置为某个输出等级时,只有大于等于该等级的日志才会输出。不同的输出适配器支持不同的日志等级配置。

logger日志等级列表
等级 配置 释义 控制台颜色
0 EMER 系统级紧急,比如磁盘出错,内存异常,网络不可用等 红色底
1 ALRT 系统级警告,比如数据库访问异常,配置文件出错等 紫色
2 CRIT 系统级危险,比如权限出错,访问异常等 蓝色
3 EROR 用户级错误 红色
4 WARN 用户级警告 黄色
5 INFO 用户级重要 天蓝色
6 DEBG 用户级调试 绿色
7 TRAC 用户级基本输出,比如成员信息,结构体值等 绿色

3.2 配置参数说明

logger当前支持控制台、文件、网络3种方式输出,这3中输出时通过各自的json格式参数进行设置,如果未配置某项适配器时,则不初始化也不会输出到该适配器。

默认配置为只控制台输出DEBG及其以上日志。

{
    "TimeFormat":"2006-01-02 15:04:05", // 输出日志开头时间格式
    "Console": {            // 控制台日志配置
        "level": "TRAC",    // 控制台日志输出等级
        "color": true       // 控制台日志颜色开关 
    },
    "File": {                   // 文件日志配置
        "filename": "app.log",  // 初始日志文件名
        "level": "TRAC",        // 日志文件日志输出等级
        "daily": true,          // 跨天后是否创建新日志文件,当append=true时有效
        "maxlines": 1000000,    // 日志文件最大行数,当append=true时有效
        "maxsize": 1,           // 日志文件最大大小,当append=true时有效
        "maxdays": -1,          // 日志文件有效期
        "append": true,         // 是否支持日志追加
        "permit": "0660"        // 新创建的日志文件权限属性
    },
    "Conn": {                       // 网络日志配置
        "net":"tcp",                // 日志传输模式
        "addr":"10.1.55.10:1024",   // 日志接收服务器
        "level": "Warn",            // 网络日志输出等级
        "reconnect":true,           // 网络断开后是否重连
        "reconnectOnMsg":false,     // 发送完每条消息后是否断开网络
    }
}

输出日志开头时间格式只要该符合go中Time.Format格式即可,例如:

时间类型 时间格式
ANSIC "Mon Jan _2 15:04:05 2006"
UnixDate "Mon Jan _2 15:04:05 MST 2006"
RubyDate "Mon Jan 02 15:04:05 -0700 2006"
RFC822 "02 Jan 06 15:04 MST"
RFC822Z "02 Jan 06 15:04 -0700"
RFC850 "Monday, 02-Jan-06 15:04:05 MST"
RFC1123 "Mon, 02 Jan 2006 15:04:05 MST"
RFC1123Z "Mon, 02 Jan 2006 15:04:05 -0700"
RFC3339 "2006-01-02T15:04:05Z07:00"
RFC3339Nano "2006-01-02T15:04:05.999999999Z07:00"
Kitchen "3:04PM"
Stamp "Jan _2 15:04:05"
StampMilli "Jan _2 15:04:05.000"
StampMicro "Jan _2 15:04:05.000000"
StampNano "Jan _2 15:04:05.000000000"
RFC3339Nano1 "2006-01-02 15:04:05.999999999 -0700 MST"
DEFAULT "2006-01-02 15:04:05"

对应的输出开头时间格式为:

========RFC1123Z time format========                                                         
Thu, 02 Aug 2018 18:48:04 +0800 [DEBG] [github.com/wonderivan/logger/log_test.go:115] Debug R
========Stamp time format========                                                            
Aug  2 18:48:04 [DEBG] [github.com/wonderivan/logger/log_test.go:115] Debug Stamp            
========StampMilli time format========                                                       
Aug  2 18:48:04.489 [DEBG] [github.com/wonderivan/logger/log_test.go:115] Debug StampMilli   
========StampNano time format========                                                        
Aug  2 18:48:04.490002155 [DEBG] [github.com/wonderivan/logger/log_test.go:115] Debug StampNa
========RubyDate time format========                                                         
Thu Aug 02 18:48:04 +0800 2018 [DEBG] [github.com/wonderivan/logger/log_test.go:115] Debug Ru
========RFC822 time format========                                                           
02 Aug 18 18:48 CST [DEBG] [github.com/wonderivan/logger/log_test.go:115] Debug RFC822       
========RFC822Z time format========                                                          
02 Aug 18 18:48 +0800 [DEBG] [github.com/wonderivan/logger/log_test.go:115] Debug RFC822Z    
========RFC1123 time format========                                                          
Thu, 02 Aug 2018 18:48:04 CST [DEBG] [github.com/wonderivan/logger/log_test.go:115] Debug RFC
========RFC3339 time format========                                                          
2018-08-02T18:48:04+08:00 [DEBG] [github.com/wonderivan/logger/log_test.go:115] Debug RFC3339
========RFC3339Nano time format========                                                      
2018-08-02T18:48:04.490377325+08:00 [DEBG] [github.com/wonderivan/logger/log_test.go:115] Deb
========ANSIC time format========                                                            
Thu Aug  2 18:48:04 2018 [DEBG] [github.com/wonderivan/logger/log_test.go:115] Debug ANSIC   
========UnixDate time format========                                                         
Thu Aug  2 18:48:04 CST 2018 [DEBG] [github.com/wonderivan/logger/log_test.go:115] Debug Unix
========RFC850 time format========                                                           
Thursday, 02-Aug-18 18:48:04 CST [DEBG] [github.com/wonderivan/logger/log_test.go:115] Debug 
========Kitchen time format========                                                          
6:48PM [DEBG] [github.com/wonderivan/logger/log_test.go:115] Debug Kitchen                   
========StampMicro time format========                                                       
Aug  2 18:48:04.490662 [DEBG] [github.com/wonderivan/logger/log_test.go:115] Debug StampMicro

3.3 设置配置参数:

通过调用logger.SetLogger(config string)方法设置参数,config支持json配置,也支持指定内容为json配置的文件路径,例如:

// 通过配置参数直接配置
    logger.SetLogger(`{"Console": {"level": "DEBG"}}`)
    // 通过配置文件配置
    logger.SetLogger("/home/log.json")

3.4 配置其他相关说明

1、当日志文件配置项append为true时,如果当前写入的日志发生跨天(daily为true)或超过最大限制时,会创建一个新文件,原有文件格式被重命名为: ****.xxxx-xx-xx.xxx.xxx 格式,例如:当向app.log写入日志时,触发了创建新文件操作,则将app.log重命名为 app.2018-01-01.001.log, 如果此时app.2018-01-01.001.log已经存在,则将刚才的app.log重命名为 app.2018-01-01.002.log,以此类推。

2、logger package默认初始化了全局的defaultLogger,所以直接调用logger.SetLogger的其实是给该对象设置输出参数,如果想要使用自定义的logger对象,需要通过logger.NewLogger()进行初始化。

3、网络配置中的reconnectOnMsg为true时,每条发送一条消息都会重连一次网络日志中心,适用于写日志频率极低的情况下的调用,可以减少长时间网络连接而占用资源。但强烈不建议平常使用时设置为true,这将会导致调用方反复的网络重连,极大增加资源消耗和延迟。

4、conn网络输出适配器经过ELK集成环境的测试验证,通过该方式发送的日志,能够正常通过Elecsearch和Kibana检索和分析

4 下载和使用

保证golang开发环境的正常配置,并且go相关工具安装完成,GOPATH等设置正常(go开发所必须的)。

执行go get github.com/wonderivan/logger , 然后import 该包即可使用。

包源码链接: golang日志包logger

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。如有错误或未考虑完全的地方,望不吝赐教。

Golang 相关文章推荐
Go Gin实现文件上传下载的示例代码
Apr 02 Golang
一文读懂go中semaphore(信号量)源码
Apr 03 Golang
go语言map与string的相互转换的实现
Apr 07 Golang
为什么不建议在go项目中使用init()
Apr 12 Golang
Go语言中break label与goto label的区别
Apr 28 Golang
goland设置颜色和字体的操作
May 05 Golang
Golang Gob编码(gob包的使用详解)
May 07 Golang
Go语言基础知识点介绍
Jul 04 Golang
golang三种设计模式之简单工厂、方法工厂和抽象工厂
Apr 10 Golang
Golang数据类型和相互转换
Apr 12 Golang
golang elasticsearch Client的使用详解
May 05 #Golang
goland设置颜色和字体的操作
golang协程池模拟实现群发邮件功能
golang 比较浮点数的大小方式
May 02 #Golang
解决Golang中goroutine执行速度的问题
May 02 #Golang
解决golang结构体tag编译错误的问题
May 02 #Golang
golang 实现Location跳转方式
May 02 #Golang
You might like
php面向对象全攻略 (三)特殊的引用“$this”的使用
2009/09/30 PHP
PHP发明人谈MVC和网站设计架构 貌似他不支持php用mvc
2011/06/04 PHP
将FCKeditor导入PHP+SMARTY的实现方法
2015/01/15 PHP
深入浅析php中sprintf与printf函数的用法及区别
2016/01/08 PHP
jquery 插件实现图片延迟加载效果代码
2010/02/06 Javascript
基于jQuery实现的水平和垂直居中的div窗口
2011/08/08 Javascript
Jquery异步请求数据实例代码
2011/12/28 Javascript
javascript 获取模态窗口的滚动位置代码
2013/08/06 Javascript
js和html5实现手机端刮刮卡抽奖效果完美兼容android/IOS
2013/11/18 Javascript
js菜单点击显示或隐藏效果的简单实例
2014/01/13 Javascript
Bootstrap基本组件学习笔记之缩略图(13)
2016/12/08 Javascript
jsonp跨域获取数据的基础教程
2018/07/01 Javascript
js HTML DOM EventListener功能与用法实例分析
2020/04/27 Javascript
python实现文件路径和url相互转换的方法
2015/07/06 Python
python中使用正则表达式的连接符示例代码
2017/10/10 Python
python实现教务管理系统
2018/03/12 Python
pytorch cnn 识别手写的字实现自建图片数据
2018/05/20 Python
Python使用pyautogui模块实现自动化鼠标和键盘操作示例
2018/09/04 Python
python 将列表中的字符串连接成一个长路径的方法
2018/10/23 Python
Pycharm设置utf-8自动显示方法
2019/01/17 Python
Django中create和save方法的不同
2019/08/13 Python
Python连接字符串过程详解
2020/01/06 Python
Python unittest生成测试报告过程解析
2020/09/08 Python
HTML5录音实践总结(Preact)
2020/05/07 HTML / CSS
欧舒丹英国官网:购买欧舒丹护手霜等明星产品
2017/01/17 全球购物
Nisbets爱尔兰:英国最大的厨房和餐饮设备供应商
2019/01/26 全球购物
巴西箱包、背包、钱包和旅行配件购物网站:Inovathi
2019/12/14 全球购物
食品营养与检测应届生求职信
2013/11/08 职场文书
初二物理教学反思
2014/01/29 职场文书
买卖协议书范本
2014/04/21 职场文书
法学院毕业生求职信
2014/06/25 职场文书
煤矿安全生产月活动总结
2014/07/05 职场文书
放射科岗位职责
2015/02/14 职场文书
同学聚会通知短信
2015/04/20 职场文书
学雷锋广播稿大全
2015/08/19 职场文书
公安纪律作风整顿心得体会
2016/01/23 职场文书