zoukankan      html  css  js  c++  java
  • Go语言系列之自定义实现日志库

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

  • 相关阅读:
    一个页面从输入url到页面加载显示完成,中间都经历了什么
    获取鼠标点击的是那个键位、阻止鼠标点击的默认事件
    获取鼠标的位置
    图片上传
    jQuery实现瀑布流(pc、移动通用)
    怎么用js或jq点击展开,出现隐藏的DIV,点击收起DIV又隐藏起来.
    js商城倒计时
    页面跳转前动画加载,页面跳转后记住滚动位置
    乐观锁与悲观锁
    过滤器、监听器、拦截器的区别
  • 原文地址:https://www.cnblogs.com/zhangyafei/p/13092469.html
Copyright © 2011-2022 走看看