日志库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. 【JavaWeb】【Maven】001 下载与配置

    Maven下载与配置 Download Url:Maven – Download Apache Maven After downloading it, unpack it and configure ...

  2. 深入分析 Java ZGC

    传统的垃圾回收 CMS 与 G1 停顿时间瓶颈 ZGC 概览 深入 ZGC 原理 标记 Marking 着色指针 Reference Coloring Relocation 重映射和读屏障 Remap ...

  3. 在项目中引入百度的ueditor编辑器

    第一步:解压ueditor压缩包 在项目中按顺序引入三个文件 <script type="text/javascript" charset="utf-8" ...

  4. A New Discrete Particle Swarm Optimization Algorithm

    题目:一种新的离散粒子群优化算法 中文摘要 粒子群优化算法在许多优化问题上表现得非常好.粒子群优化算法的缺点之一是假设算法中的变量为连续变量.本文提出一个新的粒子群优化算法,能够优化离散变量.这个新算 ...

  5. 人工水母搜索算法--JS

    1. 人工水母算法原理背景 水母生活在世界上不同深度和温度的水中.它们酷似钟状,一些水母的直径小于1cm,然有些水母直径则非常大.它们有各种各样的颜色.大小和形状.大多数水母偏好海洋环境.它们进食的方 ...

  6. 【python】青果教务系统模拟登陆

    使用 python 的 selenium + chrome 来模拟登陆学校教务系统 完整代码传至 github,增加了一个自动识别验证码的功能,不过是用的别人的轮子,识别度也不高 这是需要手动输入验证 ...

  7. MySQL管理之道,性能调优,高可用与监控(第二版)pdf下载

    MySQL管理之道,性能调优,高可用与监控(第二版) 书中内容以实战为导向,所有内容均来自于笔者多年实践经验的总结和新知识的拓展,同时也针对运维人员.DBA等相关工作者会遇到的有代表性的疑难问题给出了 ...

  8. 任务信息的高级选项(Project)

    <Project2016 企业项目管理实践>张会斌 董方好 编著 张同学说,[高级]选项卡很重要,嗯,本妖深以为然! 这里的[高级]选项卡,是指[任务信息]里的,在默认视图下,只要双击某任 ...

  9. C#面对抽象编程第一讲

    闲话不多说,面向对象编程是高级语言的一个特点,但是把它概括成面向抽象更容易直击灵魂,经过了菜鸟大家都要面对的是不要写这么菜的代码了. 上例子,这应该是大家都很熟悉耳熟能详的代码, so easy. 1 ...

  10. 自动造数据利器,Faker 了解一下?

    1. 背景 在软件需求.开发.测试过程中,有时候需要使用一些测试数据,针对这种情况,我们一般要么使用已有的系统数据,要么需要手动制造一些数据.由于现在的业务系统数据多种多样,千变万化.在手动制造数据的 ...