首頁 > 後端開發 > Golang > 主體

簡單的golang Logrus使用教程

藏色散人
發布: 2021-05-25 14:40:20
轉載
3193 人瀏覽過

下面由golang教學欄位來介紹簡單的golang Logrus給大家教學,希望對需要的朋友有幫助!

golang Logrus簡易使用教學

使用Logrus的最簡單方法:

package main
import (
  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 main
import (
  "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 main
import (
  "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_ip
requestLogger.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 logging
log.Fatal("Bye.")
// Calls panic() after logging
log.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())
登入後複製

日志轮换

Logrus不提供日志轮换。日志轮换应由logrotate(8)可以压缩和删除旧日志条目的外部程序(如)完成。它不应该是应用程序级记录器的功能。

以上是簡單的golang Logrus使用教程的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:cnblogs.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!