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

相关文章

Spring Boot集成/输出/日志级别控制/持久化开发实践

《SpringBoot集成/输出/日志级别控制/持久化开发实践》SpringBoot默认集成Logback,支持灵活日志级别配置(INFO/DEBUG等),输出包含时间戳、级别、类名等信息,并可通过... 目录一、日志概述1.1、Spring Boot日志简介1.2、日志框架与默认配置1.3、日志的核心作用

全面解析Golang 中的 Gorilla CORS 中间件正确用法

《全面解析Golang中的GorillaCORS中间件正确用法》Golang中使用gorilla/mux路由器配合rs/cors中间件库可以优雅地解决这个问题,然而,很多人刚开始使用时会遇到配... 目录如何让 golang 中的 Gorilla CORS 中间件正确工作一、基础依赖二、错误用法(很多人一开

java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)

《java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)》:本文主要介绍java中pdf模版填充表单踩坑的相关资料,OpenPDF、iText、PDFBox是三... 目录准备Pdf模版方法1:itextpdf7填充表单(1)加入依赖(2)代码(3)遇到的问题方法2:pd

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499

Python Web框架Flask、Streamlit、FastAPI示例详解

《PythonWeb框架Flask、Streamlit、FastAPI示例详解》本文对比分析了Flask、Streamlit和FastAPI三大PythonWeb框架:Flask轻量灵活适合传统应用... 目录概述Flask详解Flask简介安装和基础配置核心概念路由和视图模板系统数据库集成实际示例Stre

Olingo分析和实践之OData框架核心组件初始化(关键步骤)

《Olingo分析和实践之OData框架核心组件初始化(关键步骤)》ODataSpringBootService通过初始化OData实例和服务元数据,构建框架核心能力与数据模型结构,实现序列化、URI... 目录概述第一步:OData实例创建1.1 OData.newInstance() 详细分析1.1.1

Zabbix在MySQL性能监控方面的运用及最佳实践记录

《Zabbix在MySQL性能监控方面的运用及最佳实践记录》Zabbix通过自定义脚本和内置模板监控MySQL核心指标(连接、查询、资源、复制),支持自动发现多实例及告警通知,结合可视化仪表盘,可有效... 目录一、核心监控指标及配置1. 关键监控指标示例2. 配置方法二、自动发现与多实例管理1. 实践步骤

使用Python构建一个高效的日志处理系统

《使用Python构建一个高效的日志处理系统》这篇文章主要为大家详细讲解了如何使用Python开发一个专业的日志分析工具,能够自动化处理、分析和可视化各类日志文件,大幅提升运维效率,需要的可以了解下... 目录环境准备工具功能概述完整代码实现代码深度解析1. 类设计与初始化2. 日志解析核心逻辑3. 文件处

golang程序打包成脚本部署到Linux系统方式

《golang程序打包成脚本部署到Linux系统方式》Golang程序通过本地编译(设置GOOS为linux生成无后缀二进制文件),上传至Linux服务器后赋权执行,使用nohup命令实现后台运行,完... 目录本地编译golang程序上传Golang二进制文件到linux服务器总结本地编译Golang程序

C++ Log4cpp跨平台日志库的使用小结

《C++Log4cpp跨平台日志库的使用小结》Log4cpp是c++类库,本文详细介绍了C++日志库log4cpp的使用方法,及设置日志输出格式和优先级,具有一定的参考价值,感兴趣的可以了解一下... 目录一、介绍1. log4cpp的日志方式2.设置日志输出的格式3. 设置日志的输出优先级二、Window