• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

Go语言系列之自定义实现日志库

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

日志库logo

gitee地址传送门:https://gitee.com/zhangyafeii/logo

日志库需求分析

1. 支持往不同的地方输出日志

2. 日志分级别

  • Debug
  • Trace
  • Info
  • Warning
  • Error
  • Fatal

3. 日志要支持开关控制

4. 完整的日志记录要包含时间、行号、文件名、日志级别、日志信息

5. 打印日志可以定义输出格式,至少有text和json两种格式

6. 日志文件要切割

  • 按文件大小切割

关闭当前文件

rename

打开一个新的日志文件

FileObj

  • 按日期切割

在日志结构体中设置一个字段记录上一次切割的小时数

不一致就要切割

  • 设置日志最大保留时长

在日志结构体中设置一个字段记录最大文件保留时长

则删除

  • 设置日志文件最大保留个数

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 实现自定义级别打印文件行信息功能

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
2018.4.24 linker航海日志之 go 语言特性发布时间:2022-07-10
下一篇:
go学习笔记-运算符发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap