[golang]使用logrus自定义日志模块
简介
logrus是一个第三方日志库,性能虽不如zap和zerolog,但方便易用灵活。logrus完全兼容标准的log库,还支持文本、JSON两种日志输出格式。
特点
- 相较于标准库,logrus有更细致的日志级别,从高到低分别是:trace > debug > info > warn > error > fatal > panic
- 支持自定义日志格式,内置支持JSON格式。
- 支持可扩展的 Hooks 机制,可以为不同级别的日志添加 Hooks 将日志记录到不同位置。
- 并发安全。
安装
go get github.com/sirupsen/logrus
快速入门
package main
import (
"github.com/sirupsen/logrus"
)
func main() {
logrus.SetLevel(logrus.TraceLevel) // 默认为info日志级别
logrus.Trace("trace log")
logrus.Debug("debug log")
logrus.Info("Info log")
logrus.Warn("warn log")
logrus.Error("error log")
logrus.Panic("panic log") // panic会输出报错然后终止程序
logrus.Fatal("fatal log") // fatal会直接终止程序
}
自定义log模块
需求:自定义日志模块,实现日志文件自动分割,同时向控制台和文件输出日志。
示例代码:
tmpgo/pkg/log/log.go
package log
import (
"os"
"path/filepath"
"github.com/orandin/lumberjackrus"
"github.com/sirupsen/logrus"
)
var logger *logrus.Logger
var logDirPath string = "logs"
var logFilePath string
func init() {
// logs目录是否存在, 不存在则创建
if _,err := os.Stat(logDirPath); os.IsNotExist(err) {
os.MkdirAll(logDirPath, os.ModePerm)
}
logFilePath = filepath.Join(logDirPath, "app.log")
logger = logrus.New()
logger.SetOutput(os.Stdout) // 在标准输出中显示日志内容
logger.SetLevel(logrus.InfoLevel) // 标准输出中的日志级别
logger.SetFormatter(&logrus.JSONFormatter{ // 标准输出以json形式显示日志
TimestampFormat: "2006-01-02 15:04:05.000",
})
logger.AddHook(rotateHook()) // 通过添加hook的方式实现日志输出到文件中并自动切割
}
// 日志文件自动切割
func rotateHook() logrus.Hook {
hook, err := lumberjackrus.NewHook(&lumberjackrus.LogFile{
Filename: logFilePath,
MaxAge: 1,
MaxSize: 100,
MaxBackups: 30,
Compress: true,
LocalTime: false,
},
logrus.InfoLevel,
&logrus.JSONFormatter{TimestampFormat: "2006-01-02 15:04:05.000"},
&lumberjackrus.LogFileOpts{})
if err != nil {
logrus.Fatal(err)
}
return hook
}
func Info(v ...interface{}) {
logger.Info(v)
}
func Infof(format string, v ...interface{}) {
logger.Infof(format, v...)
}
func Warn(v ...interface{}) {
logger.Warn(v)
}
func Warnf(format string, v ...interface{}) {
logger.Warnf(format, v...)
}
func Debug(v ...interface{}) {
logger.Debug(v)
}
func Debugf(format string, v ...interface{}) {
logger.Debugf(format, v...)
}
func Error(v ...interface{}) {
logger.Error(v)
}
func Errorf(format string, v ...interface{}) {
logger.Errorf(format, v...)
}
func Panic(v ...interface{}) {
logger.Panic(v)
}
func Panicf(format string, v ...interface{}) {
logger.Panicf(format, v...)
}
func Fatal(v ...interface{}) {
logger.Fatal(v)
}
func Fatalf(format string, v ...interface{}) {
logger.Fatalf(format, v...)
}
main.go中使用
package main
import (
"tmpgo/pkg/log"
)
func main() {
log.Debug("debug log")
log.Info("Info log")
log.Warn("warn log")
log.Error("error log")
}
参考
[golang]使用logrus自定义日志模块的更多相关文章
- perl的Sys::Syslog模块(openlog,syslog,closelog函数,setlogsock)-自定义日志
perl的Sys::Syslog模块(openlog,syslog,closelog函数,setlogsock)-自定义日志 http://blog.chinaunix.net/xmlrpc.php? ...
- golang常用库:日志记录库-logrus使用
介绍 logrus 它是一个结构化.插件化的日志记录库.完全兼容 golang 标准库中的日志模块.它还内置了 2 种日志输出格式 JSONFormatter 和 TextFormatter,来定义输 ...
- 设计自用的golang日志模块
设计自用的golang日志模块 golang的原生日志模块不能满足需求,而开源的第三方包,也不完全够用.用户较多的logrus,却没有rotate功能,这已经是众所周知的.对于运维来说,当然是希望日志 ...
- golang 日志模块(log)
log 日志 log 模块可以自定义log 对象, 也可以使用log默认对象的日志方法 func New 创建log对象 func New(out io.Writer, prefix string, ...
- (16)-Python3之--自定义logging日志模块
1.自定义的日志模块如下: import logging from logging.handlers import TimedRotatingFileHandler import datetime f ...
- 【Gin-API系列】Gin中间件之日志模块(四)
日志是程序开发中必不可少的模块,同时也是日常运维定位故障的最重要环节之一.一般日志类的操作包括日志采集,日志查询,日志监控.日志统计等等.本文,我们将介绍日志模块在Gin中的使用. Golang如何打 ...
- 【腾讯Bugly干货分享】微信mars 的高性能日志模块 xlog
本文来自于腾讯bugly开发者社区,未经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/581c2c46bef1702a2db3ae53 Dev Club 是一个交流移动 ...
- Python 日志模块 logging通过配置文件方式使用
vim logger_config.ini[loggers]keys=root,infoLogger,errorlogger [logger_root]level=DEBUGhandlers=info ...
- 搭建一套自己实用的.net架构(2)【日志模块-log4net】
先谈谈简单的模块,日志.在系统中日志模块是必须的,什么系统日志,操作日志,调试日志.这里用的是log4net. 对log4net还不熟悉的小伙伴们赶快去搜索基础教程哦, 我这里就不温故了. 那么有人要 ...
- 【腾讯Bugly干货分享】微信终端跨平台组件 mars 系列(一) - 高性能日志模块xlog
本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57ff5932cde42f1f03de29b1 本文来源: 微信客户端开发团队 ...
随机推荐
- Spring AOP 分享
初级篇 AOP是什么? Aspect-oriented Programming (AOP) 即面向切面编程.简单来说,AOP 是一种编程范式,允许我们模块化地定义横跨多个对象的行为.AOP 可以帮助我 ...
- 2023-05-12:存在一个由 n 个节点组成的无向连通图,图中的节点按从 0 到 n - 1 编号, 给你一个数组 graph 表示这个图, 其中,graph[i] 是一个列表,由所有与节点 i
2023-05-12:存在一个由 n 个节点组成的无向连通图,图中的节点按从 0 到 n - 1 编号, 给你一个数组 graph 表示这个图, 其中,graph[i] 是一个列表,由所有与节点 i ...
- 2021-01-31:Redis集群方案不可用的情况有哪些?
福哥答案2021-01-31:[答案来自此链接:](https://www.zhihu.com/question/442112697)一个集群模式的官方推荐最小最佳实践方案是 6 个节点,3 个 Ma ...
- 2022-04-20:小团去参加军训,军训快要结束了, 长官想要把大家一排n个人分成m组,然后让每组分别去参加阅兵仪式, 只能选择相邻的人一组,不能随意改变队伍中人的位置, 阅兵仪式上会进行打分,其中
2022-04-20:小团去参加军训,军训快要结束了, 长官想要把大家一排n个人分成m组,然后让每组分别去参加阅兵仪式, 只能选择相邻的人一组,不能随意改变队伍中人的位置, 阅兵仪式上会进行打分,其中 ...
- 2021-09-22:请你判断一个 9x9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9
2021-09-22:请你判断一个 9x9 的数独是否有效.只需要 根据以下规则 ,验证已经填入的数字是否有效即可.数字 1-9 在每一行只能出现一次.数字 1-9 在每一列只能出现一次.数字 1-9 ...
- 2021-09-12:请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。函数 myAtoi(string
2021-09-12:请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数).函数 myAtoi(string ...
- WSGI实现一个WEB服务
- phpstudy-sqlilabs-less-14
题目:POST - Double Injection - Single quotes- String - with twist 和上关一模一样 uname=1"or 1=1 #&pa ...
- 用token辅助 密码爆破
第一步:打开皮卡丘,点击暴力破解,token防爆破,输入正确用户名,错误密码 BP拦截请求,点击皮卡丘Login,然后拦截后, 发送给Intruder 第二步: 爆破方式选择音叉方式, & ...
- 泰裤辣!!!手摸手教学,如何训练一个你的专属AI歌姬~
最近在做AIGC的项目,不过是与图片相关的,现在的模型效果可比前几年图片替换效果好多了.之前尝试过用 faceswap 工具来进行人脸替换的,具体可以参看下我之前的这篇文章:https://blog. ...