[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")
}

参考

相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
相关文章
|
1月前
|
监控 安全 程序员
Python日志模块配置:从print到logging的优雅升级指南
从 `print` 到 `logging` 是 Python 开发的必经之路。`print` 调试简单却难维护,日志混乱、无法分级、缺乏上下文;而 `logging` 支持级别控制、多输出、结构化记录,助力项目可维护性升级。本文详解痛点、优势、迁移方案与最佳实践,助你构建专业日志系统,让程序“有记忆”。
184 0
|
7月前
|
消息中间件 运维 监控
智能运维,由你定义:SAE自定义日志与监控解决方案
通过引入 Sidecar 容器的技术,SAE 为用户提供了更强大的自定义日志与监控解决方案,帮助用户轻松实现日志采集、监控指标收集等功能。未来,SAE 将会支持 istio 多租场景,帮助用户更高效地部署和管理服务网格。
514 52
|
7月前
|
JSON API Go
Golang工程组件:自定义HTTP规则的grpc-gateway选项
总的来说,grpc-gateway提供了一种简单有效的方式来为你的gRPC服务提供RESTful风格的API。通过自定义HTTP规则,你可以灵活地定义你的API的行为,以满足你的应用的需求。
168 27
|
11月前
|
运维 监控 Cloud Native
一行代码都不改,Golang 应用链路指标日志全知道
本文将通过阿里云开源的 Golang Agent,帮助用户实现“一行代码都不改”就能获取到应用产生的各种观测数据,同时提升运维团队和研发团队的幸福感。
574 142
|
8月前
|
消息中间件 运维 监控
智能运维,由你定义:SAE自定义日志与监控解决方案
SAE(Serverless应用引擎)是阿里云推出的全托管PaaS平台,致力于简化微服务应用开发与管理。为满足用户对可观测性和运维能力的更高需求,SAE引入Sidecar容器技术,实现日志采集、监控指标收集等功能扩展,且无需修改主应用代码。通过共享资源模式和独立资源模式,SAE平衡了资源灵活性与隔离性。同时,提供全链路运维能力,确保应用稳定性。未来,SAE将持续优化,支持更多场景,助力用户高效用云。
|
11月前
|
JSON 安全 API
.net 自定义日志类
在.NET中,创建自定义日志类有助于更好地管理日志信息。示例展示了如何创建、配置和使用日志记录功能,包括写入日志文件、设置日志级别、格式化消息等。注意事项涵盖时间戳、日志级别、JSON序列化、线程安全、日志格式、文件处理及示例使用。请根据需求调整代码。
172 13
|
JSON Java 数据库
SpringBoot项目使用AOP及自定义注解保存操作日志
SpringBoot项目使用AOP及自定义注解保存操作日志
253 1
|
Prometheus Cloud Native Go
Golang语言之Prometheus的日志模块使用案例
这篇文章是关于如何在Golang语言项目中使用Prometheus的日志模块的案例,包括源代码编写、编译和测试步骤。
254 4
Golang语言之Prometheus的日志模块使用案例
|
Go 开发者
【应用服务 App Service】App Service发生错误请求时,如何查看IIS Freb日志,从中得知错误所发生的模块,请求中所携带的Header信息
【应用服务 App Service】App Service发生错误请求时,如何查看IIS Freb日志,从中得知错误所发生的模块,请求中所携带的Header信息
174 2
|
开发框架 .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中的问题
190 1

推荐镜像

更多