日志库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语言系列之自定义实现日志库的更多相关文章

  1. 在Go语言项目中使用Zap日志库

    在Go语言项目中使用Zap日志库 本文先介绍了Go语言原生的日志库的使用,然后详细介绍了非常流行的Uber开源的zap日志库,同时介绍了如何搭配Lumberjack实现日志的切割和归档. 在Go语言项 ...

  2. Go语言项目中使用zap日志库(翻译)

    本文先介绍了Go语言原生的日志库的使用,然后详细介绍了非常流行的Uber开源的zap日志库,同时介绍了如何搭配Lumberjack实现日志的切割和归档. 在Go语言项目中使用Uber-go的Zap L ...

  3. R语言系列:自定义function

    在用R语言做各种事物时,用户自定义函数是不可或缺的.这期来讲讲如何自定义R的function.首先要介绍的是function的基本框架: myfunction <- function(arg1, ...

  4. 【Go语言系列】第三方框架和库——GIN:GIN介绍

    1.Gin 是什么? Gin 是一个用 Go (Golang) 编写的 HTTP web 框架. 它是一个类似于 martini 但拥有更好性能的 API 框架, 由于 httprouter,速度提高 ...

  5. 【Go语言系列】第三方框架和库——GIN:快速入门

    要求要安装Gin软件包,需要:1.安装Go(需要1.11+版本)2.设置Go工作区 安装1.下载并安装 gin: $ go get -u github.com/gin-gonic/gin 2.将 gi ...

  6. C++ 日志库 boost::log 以及 glog 的对比

    日志能方便地诊断程序原因.统计程序运行数据,是大型软件系统必不可少的组件之一.本文将从设计上和功能上对比 C++ 语言常见的两款日志库: boost::log 和 google-glog . 设计 b ...

  7. golang-Zap和Go Logger日志库

    目录 在Go语言项目中使用Zap日志库 介绍 默认的Go Logger日志库 实现Go Logger 设置Logger 使用Logger Logger的运行 Go Logger的优势和劣势 优势 劣势 ...

  8. Go语言系列之日志库zap

    在许多Go语言项目中,我们需要一个好的日志记录器能够提供下面这些功能: 能够将事件记录到文件中,而不是应用程序控制台. 日志切割-能够根据文件大小.时间或间隔等来切割日志文件. 支持不同的日志级别.例 ...

  9. Go语言系列之标准库log

    Go语言内置的log包实现了简单的日志服务.本文介绍了标准库log的基本使用. 使用Logger log包定义了Logger类型,该类型提供了一些格式化输出的方法.本包也提供了一个预定义的" ...

随机推荐

  1. jupyter的使用技巧

    具体安装教程参见上一篇博客. 1.有几种格式code,编码模式:markdown注释格式: 2.如果出现no module named 'XX' ,需要在anaconda prompt中使用conda ...

  2. 莫烦python教程学习笔记——validation_curve用于调参

    # View more python learning tutorial on my Youtube and Youku channel!!! # Youtube video tutorial: ht ...

  3. EntityFramework Core (一)记一次 .net core 使用 ef 6

    使用传统的sql去操作数据库虽然思路更加清晰,对每一步数据库读写操作都能监控到,但是对大数据存储,或存储规则复杂的程序就需要编写大量的SQL语句且不易维护..orm大大方便了复杂的数据库读写操作, 让 ...

  4. AT1980 [AGC001B] Mysterious Light 题解

    # 题意:高桥 くん 有一个边长为 N 的三枚镜子构成的正三角形 , 顶点为 a, b, c. 他有一个超级步枪 , 放在 AB 段的P点上,使得 AP=X . 并沿着平行于 BC 的方向发射一道光 ...

  5. Jenkins备份

    目录 一.目录结构 二.插件备份 一.目录结构 Jenkins的所有数据都是存放在文件中的,所以,Jenins备份其实就是备份Jenkins_HOME目录. JENKINS_HOME目录的机构如下: ...

  6. Linux下安装Calibre

    目录 一.介绍 二.安装 三.测试 四.报错处理 一.介绍 Calibre是基于python的电子书制作软件,可导出PDF.EPUB.MOBI.Word格式电子书. 二.安装 yum -y insta ...

  7. 【antd】如何自定义antd组件form表单中Form.Item里的内容组件

    需求:现有一个form表单,但是其中一个元素比较复杂,并不是简单的输入框或者下拉框之类的.但是我又希望能通过form.validateFields().then()去获得它的值,就不需要在当前页面写大 ...

  8. java 编程基础:注解的功能和作用,自定义注解

    1,什么是注解: 从JDK5开始,Java增加了对元数据 (MetaData)的支持,也就是Annotation注解,这种注解与注释不一样,注解其实是代码里的特殊标记,这些标记可以在编译.类加载 运行 ...

  9. java 网络编程基础 InetAddress类;URLDecoder和URLEncoder;URL和URLConnection;多线程下载文件示例

    什么是IPV4,什么是IPV6: IPv4使用32个二进制位在网络上创建单个唯一地址.IPv4地址由四个数字表示,用点分隔.每个数字都是十进制(以10为基底)表示的八位二进制(以2为基底)数字,例如: ...

  10. Spring Boot去掉浏览器默认的叶子图标

    在Spring Boot的配置文件application.properites中添加配置项,可以关闭默认的Favicon spring.mvc.favicon.enabled=false