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:\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 实现自定义级别打印文件行信息功能
Go语言系列之自定义实现日志库的更多相关文章
- 在Go语言项目中使用Zap日志库
在Go语言项目中使用Zap日志库 本文先介绍了Go语言原生的日志库的使用,然后详细介绍了非常流行的Uber开源的zap日志库,同时介绍了如何搭配Lumberjack实现日志的切割和归档. 在Go语言项 ...
- Go语言项目中使用zap日志库(翻译)
本文先介绍了Go语言原生的日志库的使用,然后详细介绍了非常流行的Uber开源的zap日志库,同时介绍了如何搭配Lumberjack实现日志的切割和归档. 在Go语言项目中使用Uber-go的Zap L ...
- R语言系列:自定义function
在用R语言做各种事物时,用户自定义函数是不可或缺的.这期来讲讲如何自定义R的function.首先要介绍的是function的基本框架: myfunction <- function(arg1, ...
- 【Go语言系列】第三方框架和库——GIN:GIN介绍
1.Gin 是什么? Gin 是一个用 Go (Golang) 编写的 HTTP web 框架. 它是一个类似于 martini 但拥有更好性能的 API 框架, 由于 httprouter,速度提高 ...
- 【Go语言系列】第三方框架和库——GIN:快速入门
要求要安装Gin软件包,需要:1.安装Go(需要1.11+版本)2.设置Go工作区 安装1.下载并安装 gin: $ go get -u github.com/gin-gonic/gin 2.将 gi ...
- C++ 日志库 boost::log 以及 glog 的对比
日志能方便地诊断程序原因.统计程序运行数据,是大型软件系统必不可少的组件之一.本文将从设计上和功能上对比 C++ 语言常见的两款日志库: boost::log 和 google-glog . 设计 b ...
- golang-Zap和Go Logger日志库
目录 在Go语言项目中使用Zap日志库 介绍 默认的Go Logger日志库 实现Go Logger 设置Logger 使用Logger Logger的运行 Go Logger的优势和劣势 优势 劣势 ...
- Go语言系列之日志库zap
在许多Go语言项目中,我们需要一个好的日志记录器能够提供下面这些功能: 能够将事件记录到文件中,而不是应用程序控制台. 日志切割-能够根据文件大小.时间或间隔等来切割日志文件. 支持不同的日志级别.例 ...
- Go语言系列之标准库log
Go语言内置的log包实现了简单的日志服务.本文介绍了标准库log的基本使用. 使用Logger log包定义了Logger类型,该类型提供了一些格式化输出的方法.本包也提供了一个预定义的" ...
随机推荐
- 【JavaWeb】【Maven】001 下载与配置
Maven下载与配置 Download Url:Maven – Download Apache Maven After downloading it, unpack it and configure ...
- 深入分析 Java ZGC
传统的垃圾回收 CMS 与 G1 停顿时间瓶颈 ZGC 概览 深入 ZGC 原理 标记 Marking 着色指针 Reference Coloring Relocation 重映射和读屏障 Remap ...
- 在项目中引入百度的ueditor编辑器
第一步:解压ueditor压缩包 在项目中按顺序引入三个文件 <script type="text/javascript" charset="utf-8" ...
- A New Discrete Particle Swarm Optimization Algorithm
题目:一种新的离散粒子群优化算法 中文摘要 粒子群优化算法在许多优化问题上表现得非常好.粒子群优化算法的缺点之一是假设算法中的变量为连续变量.本文提出一个新的粒子群优化算法,能够优化离散变量.这个新算 ...
- 人工水母搜索算法--JS
1. 人工水母算法原理背景 水母生活在世界上不同深度和温度的水中.它们酷似钟状,一些水母的直径小于1cm,然有些水母直径则非常大.它们有各种各样的颜色.大小和形状.大多数水母偏好海洋环境.它们进食的方 ...
- 【python】青果教务系统模拟登陆
使用 python 的 selenium + chrome 来模拟登陆学校教务系统 完整代码传至 github,增加了一个自动识别验证码的功能,不过是用的别人的轮子,识别度也不高 这是需要手动输入验证 ...
- MySQL管理之道,性能调优,高可用与监控(第二版)pdf下载
MySQL管理之道,性能调优,高可用与监控(第二版) 书中内容以实战为导向,所有内容均来自于笔者多年实践经验的总结和新知识的拓展,同时也针对运维人员.DBA等相关工作者会遇到的有代表性的疑难问题给出了 ...
- 任务信息的高级选项(Project)
<Project2016 企业项目管理实践>张会斌 董方好 编著 张同学说,[高级]选项卡很重要,嗯,本妖深以为然! 这里的[高级]选项卡,是指[任务信息]里的,在默认视图下,只要双击某任 ...
- C#面对抽象编程第一讲
闲话不多说,面向对象编程是高级语言的一个特点,但是把它概括成面向抽象更容易直击灵魂,经过了菜鸟大家都要面对的是不要写这么菜的代码了. 上例子,这应该是大家都很熟悉耳熟能详的代码, so easy. 1 ...
- 自动造数据利器,Faker 了解一下?
1. 背景 在软件需求.开发.测试过程中,有时候需要使用一些测试数据,针对这种情况,我们一般要么使用已有的系统数据,要么需要手动制造一些数据.由于现在的业务系统数据多种多样,千变万化.在手动制造数据的 ...