golang——工程组件logrus日志记录框架(结构化记录,支持文件切割,hook)

本文主要是介绍golang——工程组件logrus日志记录框架(结构化记录,支持文件切割,hook),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

logrus

介绍一个golang 日志框架logrus

  • 支持文本与JSON数据格式
  • 支持结构化记录
  • 支持hook

文档介绍

logrus文档

std

官方案例介绍了如何配置std打印

package mainimport ("os"log "github.com/sirupsen/logrus"
)func init() {// Log as JSON instead of the default ASCII formatter.log.SetFormatter(&log.JSONFormatter{})// Output to stdout instead of the default stderr// Can be any io.Writer, see below for File examplelog.SetOutput(os.Stdout)// Only log the warning severity or above.log.SetLevel(log.WarnLevel)
}func main() {log.WithFields(log.Fields{"animal": "walrus","size":   10,}).Info("A group of walrus emerges from the ocean")log.WithFields(log.Fields{"omg":    true,"number": 122,}).Warn("The group's number increased tremendously!")log.WithFields(log.Fields{"omg":    true,"number": 100,}).Fatal("The ice breaks!")// A common pattern is to re-use fields between logging statements by re-using// the logrus.Entry returned from WithFields()contextLogger := log.WithFields(log.Fields{"common": "this is a common field","other": "I also should be logged always",})contextLogger.Info("I'll be logged with common and other field")contextLogger.Info("Me too")
}

file

仔细观察,如果要输出到文件,只需要在logrus.SetOutput设置上对应的*os.File即可

文件切割

文件日志记录一般都是要切割的,不然文件太大不方便查看

采用的库

https://github.com/lestrrat-go/file-rotatelogs
案例

log.go

package logsimport ("fmt""github.com/sirupsen/logrus""log"
)type Log struct {*logrus.EntryLogWriter
}func (l *Log) Flush() {l.LogWriter.Flush()
}type LogConf struct {Level       logrus.LevelAdapterName stringHook        logrus.Hook
}func InitLog(conf LogConf) *Log {adapterName := "std"if conf.AdapterName != "" {adapterName = conf.AdapterName}writer, ok := writerAdapter[adapterName]if !ok {adapterName = "std"writer, _ = writerAdapter[adapterName]}fmt.Println("adapterName:" + adapterName)log :=&Log{logrus.NewEntry(logrus.New()),writer(),  // 初始化writer}// Log as JSON instead of the default ASCII formatter.log.Logger.SetFormatter(&logrus.JSONFormatter{})// Output to stdout instead of the default stderr// Can be any io.Writer, see below for File examplelog.Logger.SetOutput(log.LogWriter)// Only log the warning severity or above.if conf.Level != 0 {log.Logger.SetLevel(conf.Level)} else {log.Logger.SetLevel(logrus.InfoLevel)}if conf.Hook != nil {log.Logger.AddHook(conf.Hook)}// 设置日志打印位置log.Logger.SetReportCaller(true)return log
}type TestHook struct {}func (hook *TestHook) Levels() []logrus.Level {return []logrus.Level{logrus.InfoLevel}
}
func (hook *TestHook)  Fire(entry *logrus.Entry) error {log.Print("hook: %+v", entry)return nil
}

file_rotate.go

package logsimport (rotatelogs "github.com/lestrrat-go/file-rotatelogs""log""time"
)type fileRotateWriter struct {*rotatelogs.RotateLogs
}func (frw *fileRotateWriter) Flush() {frw.Close()
}func newFileRotateWriter() LogWriter {writer, err := getRotateLogs()if err != nil {log.Fatal(err)}return &fileRotateWriter{writer,}
}func getRotateLogs() (*rotatelogs.RotateLogs, error) {path := LOGPATHlogf, err := rotatelogs.New(path + ".%Y%m%d%H%M", // 指定文件格式//rotatelogs.WithLinkName(path),           // 将最新文件软链到path,windows环境不支持rotatelogs.WithMaxAge(time.Second*1800),     // 日志最长保存时长rotatelogs.WithRotationTime(time.Second*60), // 日志切分时间间隔)return logf, err
}func init() {RegisterInitWriterFunc("file-rotate", newFileRotateWriter)
}

main.go

package mainimport ("logrus-practice/logs""github.com/sirupsen/logrus"
)func main() {conf := logs.LogConf{Level: logrus.InfoLevel,AdapterName: "file-rotate",Hook: &logs.TestHook{},}log := logs.InitLog(conf)log.WithFields(logrus.Fields{"animal": "walrus","size":   10,}).Info("A group of walrus emerges from the ocean")log.WithFields(logrus.Fields{"omg":    true,"number": 122,}).Warn("The group's number increased tremendously!")log.WithFields(logrus.Fields{"omg":    true,"number": 100,}).Fatal("The ice breaks!")// A common pattern is to re-use fields between logging statements by re-using// the logrus.Entry returned from WithFields()contextLogger := log.WithFields(logrus.Fields{"common": "this is a common field","other": "I also should be logged always",})contextLogger.Info("I'll be logged with common and other field")contextLogger.Info("Me too")
}

hook机制

框架支持,在不同level的日志打印中进行hook。我们可以根据传入的*logrus.Entry里用户自定义的field进行不同的业务处理

上面代码已经含有hook的使用

type TestHook struct {}func (hook *TestHook) Levels() []logrus.Level {return []logrus.Level{logrus.InfoLevel}
}
func (hook *TestHook)  Fire(entry *logrus.Entry) error {// 可以根据data字段里的field 去做操作log.Print("hook: %+v", entry)return nil
}

生成环境中,很多公司都会采用ELK那一套,把日志转发录入到ES中,在kibana按条件搜索

这篇关于golang——工程组件logrus日志记录框架(结构化记录,支持文件切割,hook)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/254487

相关文章

SpringBoot3应用中集成和使用Spring Retry的实践记录

《SpringBoot3应用中集成和使用SpringRetry的实践记录》SpringRetry为SpringBoot3提供重试机制,支持注解和编程式两种方式,可配置重试策略与监听器,适用于临时性故... 目录1. 简介2. 环境准备3. 使用方式3.1 注解方式 基础使用自定义重试策略失败恢复机制注意事项

Python UV安装、升级、卸载详细步骤记录

《PythonUV安装、升级、卸载详细步骤记录》:本文主要介绍PythonUV安装、升级、卸载的详细步骤,uv是Astral推出的下一代Python包与项目管理器,主打单一可执行文件、极致性能... 目录安装检查升级设置自动补全卸载UV 命令总结 官方文档详见:https://docs.astral.sh/

SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志

《SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志》在SpringBoot项目中,使用logback-spring.xml配置屏蔽特定路径的日志有两种常用方式,文中的... 目录方案一:基础配置(直接关闭目标路径日志)方案二:结合 Spring Profile 按环境屏蔽关

华为鸿蒙HarmonyOS 5.1官宣7月开启升级! 首批支持名单公布

《华为鸿蒙HarmonyOS5.1官宣7月开启升级!首批支持名单公布》在刚刚结束的华为Pura80系列及全场景新品发布会上,除了众多新品的发布,还有一个消息也点燃了所有鸿蒙用户的期待,那就是Ha... 在今日的华为 Pura 80 系列及全场景新品发布会上,华为宣布鸿蒙 HarmonyOS 5.1 将于 7

统一返回JsonResult踩坑的记录

《统一返回JsonResult踩坑的记录》:本文主要介绍统一返回JsonResult踩坑的记录,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录统一返回jsonResult踩坑定义了一个统一返回类在使用时,JsonResult没有get/set方法时响应总结统一返回

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

java对接海康摄像头的完整步骤记录

《java对接海康摄像头的完整步骤记录》在Java中调用海康威视摄像头通常需要使用海康威视提供的SDK,下面这篇文章主要给大家介绍了关于java对接海康摄像头的完整步骤,文中通过代码介绍的非常详细,需... 目录一、开发环境准备二、实现Java调用设备接口(一)加载动态链接库(二)结构体、接口重定义1.类型

Golang 日志处理和正则处理的操作方法

《Golang日志处理和正则处理的操作方法》:本文主要介绍Golang日志处理和正则处理的操作方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录1、logx日志处理1.1、logx简介1.2、日志初始化与配置1.3、常用方法1.4、配合defer

Spring组件实例化扩展点之InstantiationAwareBeanPostProcessor使用场景解析

《Spring组件实例化扩展点之InstantiationAwareBeanPostProcessor使用场景解析》InstantiationAwareBeanPostProcessor是Spring... 目录一、什么是InstantiationAwareBeanPostProcessor?二、核心方法解

Apache 高级配置实战之从连接保持到日志分析的完整指南

《Apache高级配置实战之从连接保持到日志分析的完整指南》本文带你从连接保持优化开始,一路走到访问控制和日志管理,最后用AWStats来分析网站数据,对Apache配置日志分析相关知识感兴趣的朋友... 目录Apache 高级配置实战:从连接保持到日志分析的完整指南前言 一、Apache 连接保持 - 性