iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > GO >如何在golang 中使用Logrus
  • 265
分享到

如何在golang 中使用Logrus

2023-06-15 05:06:32 265人浏览 八月长安
摘要

如何在golang 中使用Logrus?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。golang Logrus简易使用教程使用Logrus的最简单方法:package&nb

如何在golang 中使用Logrus?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

golang Logrus简易使用教程

使用Logrus的最简单方法:

package mainimport (  log "GitHub.com/sirupsen/logrus")func main() {  log.WithFields(log.Fields{    "animal": "walrus",  }).Info("A walrus appears")}

请注意,它与stdlib记录器完全api兼容,因此您可以在log任何地方替换导入,log "github.com/sirupsen/logrus" 。也可以自定义所有内容:

package mainimport (  "os"  log "github.com/sirupsen/logrus")func init() {  // Log 为JSON而不是默认的ASCII格式。  log.SetFORMatter(&log.jsONFormatter{})  // 输出到标准输出,而不是默认的标准错误  //可以是任何io.Writer,请参阅下面的文件例如日志。  log.SetOutput(os.Stdout)  // 仅记录严重警告以上。  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!")  // 一种常见的模式是通过重用  //从WithFields返回的logrus.Entry 来重用日志记录语句之间的字段  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")}

对于更高级的用法,对于一个大型项目,往往需要一个全局的logrus实例,即logger对象,来记录项目所有的日志。示例如下:

package mainimport (  "os"  "github.com/sirupsen/logrus")// 创建记录器的一个新实例。您可以有任意多个实例var log = logrus.New()func main() {  // 用于设置属性的API与程序包级别  // 导出的记录器有些不同。见Godoc。  log.Out = os.Stdout  // 您可以将其设置为任何`io.Writer`  // file, err := os.OpenFile("logrus.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)  // if err == nil {  //  log.Out = file  // } else {  //  log.Info("Failed to log to file, using default stderr")  // }  log.WithFields(logrus.Fields{    "animal": "walrus",    "size":   10,  }).Info("A group of walrus emerges from the ocean")}

Fields:

Logrus鼓励通过日志记录字段而不是冗长且无法解析的错误消息进行仔细的结构化日志记录。例如,代替:log.Fatalf("Failed to send event %s to topic %s with key %d"),您应该使用:

log.WithFields(log.Fields{  "event": event,  "topic": topic,  "key": key,}).Fatal("Failed to send event")

我们发现此API会迫使您考虑以产生更多有用日志消息的方式进行日志记录。我们曾经遇到过无数种情况,在该情况下,仅向已存在的日志语句添加一个字段就可以为我们节省时间。该WithFields呼叫是可选的。

通常,使用Logrus使用printf-family函数中的任何一个应被视为提示,您应该添加一个字段,但是,您仍然可以将 printf-family函数与Logrus一起使用。

默认字段

将字段始终附加到应用程序或应用程序的一部分中的日志语句通常会很有帮助。例如,您可能希望始终在请求的上下文中记录 request_id和user_ip。无需log.WithFields(log.Fields{"request_id": request_id, "user_ip": user_ip})在每一行上都写 ,而是可以创建一个logrus.Entry传递:

requestLogger := log.WithFields(log.Fields{"request_id": request_id, "user_ip": user_ip})requestLogger.Info("something happened on that request") # will log request_id and user_iprequestLogger.Warn("something not great happened")

Hooks

您可以添加用于日志记录级别的挂钩。例如,将错误发送到上的异常跟踪服务Error,Fatal并将Panic信息发送到StatsD或同时记录到多个位置,例如syslog。

Logrus带有内置挂钩。在其中添加这些或您的自定义钩子 init:

import (  log "github.com/sirupsen/logrus"  "gopkg.in/gemnasium/logrus-airbrake-hook.v2" // the package is named "airbrake"  logrus_syslog "github.com/sirupsen/logrus/hooks/syslog"  "log/syslog")func init() {  // Use the Airbrake hook to report errors that have Error severity or above to  // an exception tracker. You can create custom hooks, see the Hooks section.  log.AddHook(airbrake.NewHook(123, "xyz", "production"))  hook, err := logrus_syslog.NewSyslogHook("udp", "localhost:514", syslog.LOG_INFO, "")  if err != nil {    log.Error("Unable to connect to local syslog daemon")  } else {    log.AddHook(hook)  }}

注意:Syslog钩子还支持连接到本地syslog(例如“ / dev / log”或“ / var / run / syslog”或“ / var / run / log”)。有关详细信息,请检查syslog挂钩README。

可以在此Wiki 页面中找到当前已知的服务挂钩的列表。

日志记录级别

Logrus具有七个日志记录级别:跟踪,调试,信息,警告,错误,严重和紧急。

log.Trace("Something very low level.")log.Debug("Useful debugging information.")log.Info("Something noteworthy happened!")log.Warn("You should probably take a look at this.")log.Error("Something failed but I'm not quitting.")// Calls os.Exit(1) after logginglog.Fatal("Bye.")// Calls panic() after logginglog.Panic("I'm bailing.")

您可以在上设置日志记录级别Logger,然后它将仅记录具有该严重性或更高严重性的条目:

// Will log anything that is info or above (warn, error, fatal, panic). Default.log.SetLevel(log.InfoLevel)

log.Level = logrus.DebugLevel如果应用程序具有调试或详细环境,则在其中进行设置可能会很有用。

参赛作品

除了添加的字段WithField或WithFields某些字段外,还会自动将其添加到所有日志记录事件中:

time。创建条目的时间戳。

msg。呼叫{Info,Warn,Error,Fatal,Panic}后传递到的日志消息AddFields。例如Failed to send event.

level。日志记录级别。例如info。

环境

Logrus没有环境概念。

如果希望只在特定环境中使用钩子和格式化程序,则应自己处理。例如,如果您的应用程序具有全局变量Environment,它是环境的字符串表示形式,则可以执行以下操作:

import (  log "github.com/sirupsen/logrus")init() {  // do something here to set environment depending on an environment variable  // or command-line flag  if Environment == "production" {    log.SetFormatter(&log.JSONFormatter{})  } else {    // The TextFormatter is default, you don't actually have to do this.    log.SetFormatter(&log.TextFormatter{})  }}

此配置是按logrus预期方式使用的,但是生产中的JSON仅在使用Splunk或Logstash等工具进行日志聚合时才有用。

格式化程序

内置的日志格式器是:

logrus.TextFormatter。如果stdout是tty,则以彩色记录事件,否则以彩色记录事件。

注意:要在没有TTY时强制输出彩色,请将ForceColors 字段设置为true。即使有TTY,也要不强制输出彩色,请将DisableColors字段设置 为true。对于windows,请参阅 github.com/mattn/go-colorable。

启用颜色后,默认情况下级别将被截断为4个字符。要禁用截断功能,请将DisableLevelTruncation字段设置为true。

输出到TTY时,以可视方式向下扫描所有级别均为相同宽度的列通常会很有帮助。通过在级别文本中添加填充,将PadLevelText字段设置为true启用此行为。

所有选项都在生成的文档中列出。

logrus.JSONFormatter。将字段记录为JSON。

所有选项都在生成的文档中列出。

第三方日志格式化程序:

FluentdFormatter。格式化可由kubernetes和Google Container Engine解析的条目。

GELF。格式化条目,使其符合Graylog的GELF 1.1规范。

logstash。将字段记录为Logstash事件。

prefixed。显示日志条目源以及备用布局。

zalgo。调用Zalgo的力量。

nested-logrus-formatter。将对数字段转换为嵌套结构。

powerful-logrus-formatter。打印日志时获取文件名,日志行号和最新函数名称;Sava日志到文件。

caption-json-formatter。添加了人类可读标题的logrus消息json格式化程序。

您可以通过实现Formatter接口(需要一种Format方法)来定义格式化程序。Format需要一个*Entry。entry.Data是一种 Fields类型(map[string]interface{}),其中包含您的所有字段以及默认字段(请参见上面的条目部分):

type MyJSONFormatter struct {}log.SetFormatter(new(MyJSONFormatter))func (f *MyJSONFormatter) Format(entry *Entry) ([]byte, error) {  // Note this doesn't include Time, Level and Message which are available on  // the Entry. Consult `godoc` on information about those fields or read the  // source of the official loggers.  serialized, err := json.Marshal(entry.Data)    if err != nil {      return nil, fmt.Errorf("Failed to marshal fields to JSON, %v", err)    }  return append(serialized, '\n'), nil}

记录为 io.Writer

Logrus可以转换为io.Writer。该作家是an的结尾,io.Pipe您有责任关闭它。

w := logger.Writer()defer w.Close()srv := Http.Server{    // create a stdlib log.Logger that writes to    // logrus.Logger.    ErrorLog: log.New(w, "", 0),}

写入该写入器的每一行都将使用格式化程序和钩子以常规方式打印。这些条目的级别为info。

这意味着我们可以轻松覆盖标准库记录器:

logger := logrus.New()logger.Formatter = &logrus.JSONFormatter{}// Use logrus for standard log output// Note that `log` here references stdlib's log// Not logrus imported under the name `log`.log.SetOutput(logger.Writer())

golang的优点

golang是一种编译语言,可以将代码编译为机器代码,编译后的二进制文件可以直接部署到目标机器而无需额外的依赖,所以golang的性能优于其他的解释性语言,且可以在golang中使用goroutine来实现并发性,它提供了一个非常优雅的goroutine调度程序系统,可以很容易地生成数百万个goroutine。

关于如何在golang 中使用Logrus问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注编程网GO频道了解更多相关知识。

您可能感兴趣的文档:

--结束END--

本文标题: 如何在golang 中使用Logrus

本文链接: https://www.lsjlt.com/news/277993.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何在golang 中使用Logrus
    如何在golang 中使用Logrus?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。golang Logrus简易使用教程使用Logrus的最简单方法:package&nb...
    99+
    2023-06-15
  • 如何在golang中使用cobra库
    如何在golang中使用cobra库?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。cobra  是 go 语言的一个库,可以用于编写命令行工具。通常我...
    99+
    2023-06-15
  • Docker API如何在Golang中使用
    Docker API如何在Golang中使用?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。安装 SDK通过下面的命令就可以安装 SDK 了:go get g...
    99+
    2023-06-14
  • 如何在Golang中使用模板
    Golang使用模板的步骤:1、用go get命令安装模板引擎;2、创建一个包含占位符的文本文件;3、使用Parse()方法解析模板;4、使用Execute()方法渲染模板;5、模板变量的解析;6、如果模板需要包含子模板,可以进行模板嵌套;...
    99+
    2023-12-12
    Golang
  • 如何在Golang中使用协程
    这篇文章将为大家详细讲解有关如何在Golang中使用协程,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。什么是golanggolang 是Google开发的一种静态强类型、编译型、并发型,并具...
    99+
    2023-06-14
  • 如何在 Golang 中使用事务?
    非常抱歉,由于您没有提供文章标题,我无法为您生成一篇高质量的文章。请您提供文章标题,我将尽快为您生成一篇优质的文章。...
    99+
    2024-05-14
  • 如何在Golang中使用Mockery v0.0.0-dev?
    php小编西瓜将为您介绍如何在Golang中使用Mockery v0.0.0-dev。Mockery是一个用于创建和管理mock对象的开源库,它帮助我们在测试过程中模拟依赖项。使用Mo...
    99+
    2024-02-10
  • 如何在mongodb中使用golang驱动
    如何在mongodb中使用golang驱动?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。使用教程如下:导入go get g...
    99+
    2024-04-02
  • 如何在Golang中使用方法注释
    在Golang中,注释是一种很重要的代码文档形式,给别人或自己日后看代码时提供详细的说明和解释。注释帮助我们快速理解代码,并准确地了解代码的目的和功能,特别是当我们需要修改或扩展代码时。本文将介绍如何在Golang中使用方法注释,方法注释是...
    99+
    2023-05-14
  • 如何在Golang中使用内建容器
    今天就跟大家聊聊有关如何在Golang中使用内建容器,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。什么是golanggolang 是Google开发的一种静态强类型、编译型、并发型,...
    99+
    2023-06-14
  • 如何在golang中使用Json序列化
    这篇文章给大家介绍如何在golang中使用Json序列化,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。go自带json库"encoding/json" 官当自带json-iterator号...
    99+
    2023-06-14
  • 如何在 Golang 中使用数据库锁?
    非常抱歉,由于您没有提供文章标题,我无法为您生成一篇高质量的文章。请您提供文章标题,我将尽快为您生成一篇优质的文章。...
    99+
    2024-05-14
  • 如何在golang中使用module依赖包
    今天就跟大家聊聊有关如何在golang中使用module依赖包,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。module介绍go module是go新的依赖包管理系统,go modu...
    99+
    2023-06-14
  • 如何在golang中使用type关键词
    如何在golang中使用type关键词?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。golang适合做什么golang可以做服务器端开发,但golang很适合做...
    99+
    2023-06-06
  • 如何在golang中使用logger日志包
    这篇文章给大家介绍如何在golang中使用logger日志包,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。golang的优点golang是一种编译语言,可以将代码编译为机器代码,编译后的二进制文件可以直接部署到目标机器...
    99+
    2023-06-14
  • 如何在 Golang 中使用数据库迁移?
    非常抱歉,由于您没有提供文章标题,我无法为您生成一篇高质量的文章。请您提供文章标题,我将尽快为您生成一篇优质的文章。...
    99+
    2024-05-14
  • Golang函数如何在Web框架中使用?
    go 函数在 web 框架中用于:处理请求和生成响应。可作为可重复使用的处理器函数。可分组在函数组中以实现功能模块化。可作为中间件执行预处理或后处理操作。 Go 函数如何在 Web 框...
    99+
    2024-04-11
    golang web框架 git
  • 如何在golang中使用for循环在struct中存储值
    Golang不知道大家是否熟悉?今天我将给大家介绍《如何在golang中使用for循环在struct中存储值》,这篇文章主要会讲到等等知识点,如果你在看完本篇文章后,有更好的建议或者发现哪里有问题,...
    99+
    2024-04-04
  • golang中如何使用JSON
    今天小编给大家分享一下golang中如何使用JSON的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。JSON是一种通用的数据交...
    99+
    2023-07-06
  • Golang中如何使用 Iota
    这篇文章给大家介绍Golang中如何使用 Iota,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。如何实现枚举iota 是 Go 中预声明的一个特殊常量。它会被预声明为0,但是它的值在编译阶段并非是固定的,当预声明的 i...
    99+
    2023-06-15
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作