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

相关文章

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

JS常用组件收集

收集了一些平时遇到的前端比较优秀的组件,方便以后开发的时候查找!!! 函数工具: Lodash 页面固定: stickUp、jQuery.Pin 轮播: unslider、swiper 开关: switch 复选框: icheck 气泡: grumble 隐藏元素: Headroom

如何在页面调用utility bar并传递参数至lwc组件

1.在app的utility item中添加lwc组件: 2.调用utility bar api的方式有两种: 方法一,通过lwc调用: import {LightningElement,api ,wire } from 'lwc';import { publish, MessageContext } from 'lightning/messageService';import Ca

cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个?

跨平台系列 cross-plateform 跨平台应用程序-01-概览 cross-plateform 跨平台应用程序-02-有哪些主流技术栈? cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个? cross-plateform 跨平台应用程序-04-React Native 介绍 cross-plateform 跨平台应用程序-05-Flutte

Node.js学习记录(二)

目录 一、express 1、初识express 2、安装express 3、创建并启动web服务器 4、监听 GET&POST 请求、响应内容给客户端 5、获取URL中携带的查询参数 6、获取URL中动态参数 7、静态资源托管 二、工具nodemon 三、express路由 1、express中路由 2、路由的匹配 3、路由模块化 4、路由模块添加前缀 四、中间件

Spring框架5 - 容器的扩展功能 (ApplicationContext)

private static ApplicationContext applicationContext;static {applicationContext = new ClassPathXmlApplicationContext("bean.xml");} BeanFactory的功能扩展类ApplicationContext进行深度的分析。ApplicationConext与 BeanF

flume系列之:查看flume系统日志、查看统计flume日志类型、查看flume日志

遍历指定目录下多个文件查找指定内容 服务器系统日志会记录flume相关日志 cat /var/log/messages |grep -i oom 查找系统日志中关于flume的指定日志 import osdef search_string_in_files(directory, search_string):count = 0

我在移动打工的日志

客户:给我搞一下录音 我:不会。不在服务范围。 客户:是不想吧 我:笑嘻嘻(气笑) 客户:小姑娘明明会,却欺负老人 我:笑嘻嘻 客户:那我交话费 我:手机号 客户:给我搞录音 我:不会。不懂。没搞过。 客户:那我交话费 我:手机号。这是电信的啊!!我这是中国移动!! 客户:我不管,我要充话费,充话费是你们的 我:可是这是移动!!中国移动!! 客户:我这是手机号 我:那又如何,这是移动!你是电信!!

数据治理框架-ISO数据治理标准

引言 "数据治理"并不是一个新的概念,国内外有很多组织专注于数据治理理论和实践的研究。目前国际上,主要的数据治理框架有ISO数据治理标准、GDI数据治理框架、DAMA数据治理管理框架等。 ISO数据治理标准 改标准阐述了数据治理的标准、基本原则和数据治理模型,是一套完整的数据治理方法论。 ISO/IEC 38505标准的数据治理方法论的核心内容如下: 数据治理的目标:促进组织高效、合理地

ZooKeeper 中的 Curator 框架解析

Apache ZooKeeper 是一个为分布式应用提供一致性服务的软件。它提供了诸如配置管理、分布式同步、组服务等功能。在使用 ZooKeeper 时,Curator 是一个非常流行的客户端库,它简化了 ZooKeeper 的使用,提供了高级的抽象和丰富的工具。本文将详细介绍 Curator 框架,包括它的设计哲学、核心组件以及如何使用 Curator 来简化 ZooKeeper 的操作。 1