[golang]使用logrus自定义日志模块

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: [golang]使用logrus自定义日志模块

简介

logrus是一个第三方日志库,性能虽不如zapzerolog,但方便易用灵活。logrus完全兼容标准的log库,还支持文本、JSON两种日志输出格式。

特点

  • 相较于标准库,logrus有更细致的日志级别,从高到低分别是:trace > debug > info > warn > error > fatal > panic
  • 支持自定义日志格式,内置支持JSON格式。
  • 支持可扩展的 Hooks 机制,可以为不同级别的日志添加 Hooks 将日志记录到不同位置。
  • 并发安全。

安装

go get github.com/sirupsen/logrus

快速入门

package main
import (
  "github.com/sirupsen/logrus"
)
func main() {
  logrus.SetLevel(logrus.TraceLevel)  // 默认为info日志级别
  logrus.Trace("trace log")
  logrus.Debug("debug log")
  logrus.Info("Info log")
  logrus.Warn("warn log")
  logrus.Error("error log")
  logrus.Panic("panic log") // panic会输出报错然后终止程序
  logrus.Fatal("fatal log")   // fatal会直接终止程序
}

自定义log模块

需求:自定义日志模块,实现日志文件自动分割,同时向控制台和文件输出日志。

示例代码:

  • tmpgo/pkg/log/log.go
package log
import (
  "os"
  "path/filepath"
  "github.com/orandin/lumberjackrus"
  "github.com/sirupsen/logrus"
)
var logger *logrus.Logger
var logDirPath string = "logs"
var logFilePath string
func init() {
  // logs目录是否存在, 不存在则创建
  if _,err := os.Stat(logDirPath); os.IsNotExist(err) {
    os.MkdirAll(logDirPath, os.ModePerm)
  }
  logFilePath = filepath.Join(logDirPath, "app.log")
  logger = logrus.New()
  logger.SetOutput(os.Stdout)    // 在标准输出中显示日志内容
  logger.SetLevel(logrus.InfoLevel)    // 标准输出中的日志级别
  logger.SetFormatter(&logrus.JSONFormatter{    // 标准输出以json形式显示日志
    TimestampFormat: "2006-01-02 15:04:05.000",
  })
  logger.AddHook(rotateHook())    // 通过添加hook的方式实现日志输出到文件中并自动切割
}
// 日志文件自动切割
func rotateHook() logrus.Hook {
  hook, err := lumberjackrus.NewHook(&lumberjackrus.LogFile{
    Filename:   logFilePath,
    MaxAge:     1,
    MaxSize:    100,
    MaxBackups: 30,
    Compress:   true,
    LocalTime:  false,
  },
    logrus.InfoLevel,
    &logrus.JSONFormatter{TimestampFormat: "2006-01-02 15:04:05.000"},
    &lumberjackrus.LogFileOpts{})
  if err != nil {
    logrus.Fatal(err)
  }
  return hook
}
func Info(v ...interface{}) {
  logger.Info(v)
}
func Infof(format string, v ...interface{}) {
  logger.Infof(format, v...)
}
func Warn(v ...interface{}) {
  logger.Warn(v)
}
func Warnf(format string, v ...interface{}) {
  logger.Warnf(format, v...)
}
func Debug(v ...interface{}) {
  logger.Debug(v)
}
func Debugf(format string, v ...interface{}) {
  logger.Debugf(format, v...)
}
func Error(v ...interface{}) {
  logger.Error(v)
}
func Errorf(format string, v ...interface{}) {
  logger.Errorf(format, v...)
}
func Panic(v ...interface{}) {
  logger.Panic(v)
}
func Panicf(format string, v ...interface{}) {
  logger.Panicf(format, v...)
}
func Fatal(v ...interface{}) {
  logger.Fatal(v)
}
func Fatalf(format string, v ...interface{}) {
  logger.Fatalf(format, v...)
}
  • main.go中使用
package main
import (
  "tmpgo/pkg/log"
)
func main() {
  log.Debug("debug log")
  log.Info("Info log")
  log.Warn("warn log")
  log.Error("error log")
}

参考

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
2天前
|
JSON Java 数据库
SpringBoot项目使用AOP及自定义注解保存操作日志
SpringBoot项目使用AOP及自定义注解保存操作日志
14 1
|
2月前
|
Prometheus Cloud Native Go
Golang语言之Prometheus的日志模块使用案例
这篇文章是关于如何在Golang语言项目中使用Prometheus的日志模块的案例,包括源代码编写、编译和测试步骤。
45 3
Golang语言之Prometheus的日志模块使用案例
|
2月前
|
Shell Python
salt自定义模块内使用日志例子
salt自定义模块内使用日志例子
logging 日志 模块
logging 日志 模块
|
3月前
|
开发框架 .NET Docker
【Azure 应用服务】App Service .NET Core项目在Program.cs中自定义添加的logger.LogInformation,部署到App Service上后日志不显示Log Stream中的问题
【Azure 应用服务】App Service .NET Core项目在Program.cs中自定义添加的logger.LogInformation,部署到App Service上后日志不显示Log Stream中的问题
|
3月前
|
Go 开发者
【应用服务 App Service】App Service发生错误请求时,如何查看IIS Freb日志,从中得知错误所发生的模块,请求中所携带的Header信息
【应用服务 App Service】App Service发生错误请求时,如何查看IIS Freb日志,从中得知错误所发生的模块,请求中所携带的Header信息
|
3月前
|
数据挖掘 语音技术
3D-Speaker说话人任务的开源项目问题之语义说话人信息模块在说话人日志系统中的问题如何解决
3D-Speaker说话人任务的开源项目问题之语义说话人信息模块在说话人日志系统中的问题如何解决
|
3月前
|
存储 监控 Java
|
3月前
|
JSON Go API
一文搞懂 Golang 高性能日志库 - Zap
一文搞懂 Golang 高性能日志库 - Zap
160 2
|
3月前
|
人工智能 数据库连接 Go
Golang 搭建 WebSocket 应用(五) - 消息推送日志
Golang 搭建 WebSocket 应用(五) - 消息推送日志
29 1