Go语言系列之自定义实现日志库
2024-09-03 12:23:56
日志库logo
gitee地址传送门:https://gitee.com/zhangyafeii/logo
日志库需求分析
1. 支持往不同的地方输出日志
2. 日志分级别
- Debug
- Trace
- Info
- Warning
- Error
- Fatal
3. 日志要支持开关控制
4. 完整的日志记录要包含时间、行号、文件名、日志级别、日志信息
5. 打印日志可以定义输出格式,至少有text和json两种格式
6. 日志文件要切割
- 按文件大小切割
1. 关闭当前文件
2. 备份一个 rename
3. 打开一个新的日志文件
4. 将打开的文件赋值给 fl.FileObj
- 按日期切割
1. 在日志结构体中设置一个字段记录上一次切割的小时数
2. 再写日志之前检查一下当前时间的小时数和保存的是否一致,不一致就要切割
- 设置日志最大保留时长
1. 在日志结构体中设置一个字段记录最大文件保留时长
2. 定时扫描所有日志文件,若日志文件时间早于保留最早时间,则删除
- 设置日志文件最大保留个数
1. 在日志结构体中设置一个字段记录最大保留文件个数
2. 定时扫描所有日志文件。 若日志文件数量超出指定个数时,保留指定个数最新文件,其余文件删除
7. 性能优化:异步打印日志
使用示例
go get -u gitee.com/zhangyafeii/logo
1. console打印
package main import "gitee.com/zhangyafeii/logo" var myLog logo.Logger func main() {
myLog := logo.NewConsoleLog("debug")
myLog.SetPrefix("[MY-LOG]") myLog.Debug("这是一条Debug日志")
myLog.Trace("这是一条Trace日志")
myLog.Info("这是一条Info日志")
myLog.Warning("这是一条Warning日志")
name := "zhangyafei"
myLog.Error("这是一条Error日志, name:%s", name)
myLog.Fatal("这是一条Fatal日志")
}
终端
E:\go\project\src\go_Logger>go_Logger.exe
[MY-LOG] 2020/06/11 - 12:22:04 Debug E:/go/project/src/go_Logger/main.go:main:25 这是一条Debug日志
[MY-LOG] 2020/06/11 - 12:22:04 Trace E:/go/project/src/go_Logger/main.go:main:26 这是一条Trace日志
[MY-LOG] 2020/06/11 - 12:22:04 Info E:/go/project/src/go_Logger/main.go:main:27 这是一条Info日志
[MY-LOG] 2020/06/11 - 12:22:04 Warning E:/go/project/src/go_Logger/main.go:main:28 这是一条Warning日志
[MY-LOG] 2020/06/11 - 12:22:04 Error E:/go/project/src/go_Logger/main.go:main:30 这是一条Error日志, name:zhangyafei
[MY-LOG] 2020/06/11 - 12:22:04 Fatal E:/go/project/src/go_Logger/main.go:main:31 这是一条Fatal日志
2. 写入文件-按文件大小切割
package main import "gitee.com/zhangyafeii/logo" var myLog logo.Logger func main() {
myLog = logo.NewFileLog("info", "log", "mylog.log", 10*1024*1024)
myLog.SetPrefix("[MY-LOG]") myLog.Debug("这是一条Debug日志")
myLog.Trace("这是一条Trace日志")
myLog.Info("这是一条Info日志")
myLog.Warning("这是一条Warning日志")
name := "zhangyafei"
myLog.Error("这是一条Error日志, name:%s", name)
myLog.Fatal("这是一条Fatal日志")
}
log/mylog.log
[MY-LOG] 2020/06/11 - 12:24:20 Info E:/go/project/src/go_Logger/main.go:main:27 这是一条Info日志
[MY-LOG] 2020/06/11 - 12:24:20 Warning E:/go/project/src/go_Logger/main.go:main:28 这是一条Warning日志
[MY-LOG] 2020/06/11 - 12:24:20 Error E:/go/project/src/go_Logger/main.go:main:30 这是一条Error日志, name:zhangyafei
[MY-LOG] 2020/06/11 - 12:24:20 Fatal E:/go/project/src/go_Logger/main.go:main:31 这是一条Fatal日志
log/mylog.log.err
[MY-LOG] 2020/06/11 - 12:24:20 Error E:/go/project/src/go_Logger/main.go:main:30 这是一条Error日志, name:zhangyafei
[MY-LOG] 2020/06/11 - 12:24:20 Fatal E:/go/project/src/go_Logger/main.go:main:31 这是一条Fatal日志
文件大小切割
package main import "gitee.com/zhangyafeii/logo" var myLog logo.Logger func main() {
myLog = logo.NewFileLog("info", "log", "mylog.log", 10*1024*1024)
myLog.SetPrefix("[MY-LOG]")
for {
myLog.Debug("这是一条Debug日志")
myLog.Trace("这是一条Trace日志")
myLog.Info("这是一条Info日志")
myLog.Warning("这是一条Warning日志")
name := "zhangyafei"
myLog.Error("这是一条Error日志, name:%s", name)
myLog.Fatal("这是一条Fatal日志")
}
}
3. 写入文件-按文件大小和时间切割
package main import "gitee.com/zhangyafeii/logo" var myLog logo.Logger func main() {
myLog = logo.NewFileLogWithMaxAge("Debug", "log", "mylog.log", 10*1024*1024, 24)
myLog.SetPrefix("[MY-LOG]")
for {
myLog.Debug("这是一条Debug日志")
myLog.Trace("这是一条Trace日志")
myLog.Info("这是一条Info日志")
myLog.Warning("这是一条Warning日志")
name := "zhangyafei"
myLog.Error("这是一条Error日志, name:%s", name)
myLog.Fatal("这是一条Fatal日志")
}
}
更新日志
2020.06.15 增加异步打印日志功能和日志同时输出console和file功能
2020.06.16 增加自定义日志文件最大保留时长功能
2020.06.17 增加自定义日志文件最大保留个数功能,生成文件Logger时可以传不定长参数
2020.06.18 增加日志输出Json格式,优化日志打印效率
2020.06.24 修改日志输入文件参数解析框架,提高参数传值和解析效率
2020.07.05 实现自定义级别打印文件行信息功能
最新文章
- Ajax_01之概述、响应
- OS的沙盒机制 --基础知识
- AOP和IOC的作用
- epon e8-c HG220GS超级密码破解
- 使用grep恢复被删除文件内容【转】
- OpenWrt编译到底脚本
- Libgdx Box2D真实---这缓释微丸(三:规则经常使用body和精灵联合)
- 【转】如何实现一个malloc
- Examples_06_02(android)DDMS的data文件中没有显示文件。
- [工具]Mac下非常好用的快捷终端Dterm
- 【卸载】oracle卸载
- java乱码问题处理
- 跨主机使用 Rex-Ray volume - 每天5分钟玩转 Docker 容器技术(77)
- RecyclerView下拉刷新上拉加载(二)
- 原生js实现双向数据绑定
- 八皇后问题 递归实现 C语言 超详细 思路 基础
- Linux 下 Nginx 反向代理 负载均衡配置
- English trip -- VC(情景课)3 D Reading
- Jenkins 使用学习笔记
- 牛客网Java刷题知识点之构造函数是什么、一般函数和构造函数什么区别呢、构造函数的重载、构造函数的内存图解