真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

如何在golang中使用Logrus

如何在golang 中使用Logrus?針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。

創(chuàng)新互聯(lián)公司致力于成都網(wǎng)站建設(shè)、網(wǎng)站建設(shè),成都網(wǎng)站設(shè)計(jì),集團(tuán)網(wǎng)站建設(shè)等服務(wù)標(biāo)準(zhǔn)化,推過(guò)標(biāo)準(zhǔn)化降低中小企業(yè)的建站的成本,并持續(xù)提升建站的定制化服務(wù)水平進(jìn)行質(zhì)量交付,讓企業(yè)網(wǎng)站從市場(chǎng)競(jìng)爭(zhēng)中脫穎而出。 選擇創(chuàng)新互聯(lián)公司,就選擇了安全、穩(wěn)定、美觀(guān)的網(wǎng)站建設(shè)服務(wù)!

golang Logrus簡(jiǎn)易使用教程

使用Logrus的最簡(jiǎn)單方法:

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

請(qǐng)注意,它與stdlib記錄器完全api兼容,因此您可以在log任何地方替換導(dǎo)入,log "github.com/sirupsen/logrus" 。也可以自定義所有內(nèi)容:

package main
import (
  "os"
  log "github.com/sirupsen/logrus"
)
func init() {
  // Log 為JSON而不是默認(rèn)的ASCII格式。
  log.SetFormatter(&log.JSONFormatter{})
  // 輸出到標(biāo)準(zhǔn)輸出,而不是默認(rèn)的標(biāo)準(zhǔn)錯(cuò)誤
  //可以是任何io.Writer,請(qǐng)參閱下面的文件例如日志。
  log.SetOutput(os.Stdout)
  // 僅記錄嚴(yán)重警告以上。
  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!")
  // 一種常見(jiàn)的模式是通過(guò)重用
  //從WithFields返回的logrus.Entry 來(lái)重用日志記錄語(yǔ)句之間的字段
  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")
}

對(duì)于更高級(jí)的用法,對(duì)于一個(gè)大型項(xiàng)目,往往需要一個(gè)全局的logrus實(shí)例,即logger對(duì)象,來(lái)記錄項(xiàng)目所有的日志。示例如下:

package main
import (
  "os"
  "github.com/sirupsen/logrus"
)
// 創(chuàng)建記錄器的一個(gè)新實(shí)例。您可以有任意多個(gè)實(shí)例
var log = logrus.New()
func main() {
  // 用于設(shè)置屬性的API與程序包級(jí)別
  // 導(dǎo)出的記錄器有些不同。見(jiàn)Godoc。
  log.Out = os.Stdout
  // 您可以將其設(shè)置為任何`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鼓勵(lì)通過(guò)日志記錄字段而不是冗長(zhǎng)且無(wú)法解析的錯(cuò)誤消息進(jìn)行仔細(xì)的結(jié)構(gòu)化日志記錄。例如,代替:log.Fatalf("Failed to send event %s to topic %s with key %d"),您應(yīng)該使用:

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

我們發(fā)現(xiàn)此API會(huì)迫使您考慮以產(chǎn)生更多有用日志消息的方式進(jìn)行日志記錄。我們?cè)?jīng)遇到過(guò)無(wú)數(shù)種情況,在該情況下,僅向已存在的日志語(yǔ)句添加一個(gè)字段就可以為我們節(jié)省時(shí)間。該WithFields呼叫是可選的。

通常,使用Logrus使用printf-family函數(shù)中的任何一個(gè)應(yīng)被視為提示,您應(yīng)該添加一個(gè)字段,但是,您仍然可以將 printf-family函數(shù)與Logrus一起使用。

默認(rèn)字段

將字段始終附加到應(yīng)用程序或應(yīng)用程序的一部分中的日志語(yǔ)句通常會(huì)很有幫助。例如,您可能希望始終在請(qǐng)求的上下文中記錄 request_id和user_ip。無(wú)需log.WithFields(log.Fields{"request_id": request_id, "user_ip": user_ip})在每一行上都寫(xiě) ,而是可以創(chuàng)建一個(gè)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

您可以添加用于日志記錄級(jí)別的掛鉤。例如,將錯(cuò)誤發(fā)送到上的異常跟蹤服務(wù)Error,F(xiàn)atal并將Panic信息發(fā)送到StatsD或同時(shí)記錄到多個(gè)位置,例如syslog。

Logrus帶有內(nèi)置掛鉤。在其中添加這些或您的自定義鉤子 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”)。有關(guān)詳細(xì)信息,請(qǐng)檢查syslog掛鉤README。

可以在此Wiki 頁(yè)面中找到當(dāng)前已知的服務(wù)掛鉤的列表。

日志記錄級(jí)別

Logrus具有七個(gè)日志記錄級(jí)別:跟蹤,調(diào)試,信息,警告,錯(cuò)誤,嚴(yán)重和緊急。

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.")

您可以在上設(shè)置日志記錄級(jí)別Logger,然后它將僅記錄具有該嚴(yán)重性或更高嚴(yán)重性的條目:

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

log.Level = logrus.DebugLevel如果應(yīng)用程序具有調(diào)試或詳細(xì)環(huán)境,則在其中進(jìn)行設(shè)置可能會(huì)很有用。

參賽作品

除了添加的字段WithField或WithFields某些字段外,還會(huì)自動(dòng)將其添加到所有日志記錄事件中:

time。創(chuàng)建條目的時(shí)間戳。

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

level。日志記錄級(jí)別。例如info。

環(huán)境

Logrus沒(méi)有環(huán)境概念。

如果希望只在特定環(huán)境中使用鉤子和格式化程序,則應(yīng)自己處理。例如,如果您的應(yīng)用程序具有全局變量Environment,它是環(huán)境的字符串表示形式,則可以執(zhí)行以下操作:

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預(yù)期方式使用的,但是生產(chǎn)中的JSON僅在使用Splunk或Logstash等工具進(jìn)行日志聚合時(shí)才有用。

格式化程序

內(nèi)置的日志格式器是:

logrus.TextFormatter。如果stdout是tty,則以彩色記錄事件,否則以彩色記錄事件。

注意:要在沒(méi)有TTY時(shí)強(qiáng)制輸出彩色,請(qǐng)將ForceColors 字段設(shè)置為true。即使有TTY,也要不強(qiáng)制輸出彩色,請(qǐng)將DisableColors字段設(shè)置 為true。對(duì)于Windows,請(qǐng)參閱 github.com/mattn/go-colorable。

啟用顏色后,默認(rèn)情況下級(jí)別將被截?cái)酁?個(gè)字符。要禁用截?cái)喙δ?,?qǐng)將DisableLevelTruncation字段設(shè)置為true。

輸出到TTY時(shí),以可視方式向下掃描所有級(jí)別均為相同寬度的列通常會(huì)很有幫助。通過(guò)在級(jí)別文本中添加填充,將PadLevelText字段設(shè)置為true啟用此行為。

所有選項(xiàng)都在生成的文檔中列出。

logrus.JSONFormatter。將字段記錄為JSON。

所有選項(xiàng)都在生成的文檔中列出。

第三方日志格式化程序:

FluentdFormatter。格式化可由Kubernetes和Google Container Engine解析的條目。

GELF。格式化條目,使其符合Graylog的GELF 1.1規(guī)范。

logstash。將字段記錄為L(zhǎng)ogstash事件。

prefixed。顯示日志條目源以及備用布局。

zalgo。調(diào)用Zalgo的力量。

nested-logrus-formatter。將對(duì)數(shù)字段轉(zhuǎn)換為嵌套結(jié)構(gòu)。

powerful-logrus-formatter。打印日志時(shí)獲取文件名,日志行號(hào)和最新函數(shù)名稱(chēng);Sava日志到文件。

caption-json-formatter。添加了人類(lèi)可讀標(biāo)題的logrus消息json格式化程序。

您可以通過(guò)實(shí)現(xiàn)Formatter接口(需要一種Format方法)來(lái)定義格式化程序。Format需要一個(gè)*Entry。entry.Data是一種 Fields類(lèi)型(map[string]interface{}),其中包含您的所有字段以及默認(rèn)字段(請(qǐng)參見(jiàn)上面的條目部分):

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可以轉(zhuǎn)換為io.Writer。該作家是an的結(jié)尾,io.Pipe您有責(zé)任關(guān)閉它。

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

寫(xiě)入該寫(xiě)入器的每一行都將使用格式化程序和鉤子以常規(guī)方式打印。這些條目的級(jí)別為info。

這意味著我們可以輕松覆蓋標(biāo)準(zhǔn)庫(kù)記錄器:

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的優(yōu)點(diǎn)

golang是一種編譯語(yǔ)言,可以將代碼編譯為機(jī)器代碼,編譯后的二進(jìn)制文件可以直接部署到目標(biāo)機(jī)器而無(wú)需額外的依賴(lài),所以golang的性能優(yōu)于其他的解釋性語(yǔ)言,且可以在golang中使用goroutine來(lái)實(shí)現(xiàn)并發(fā)性,它提供了一個(gè)非常優(yōu)雅的goroutine調(diào)度程序系統(tǒng),可以很容易地生成數(shù)百萬(wàn)個(gè)goroutine。

關(guān)于如何在golang 中使用Logrus問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識(shí)。


網(wǎng)頁(yè)名稱(chēng):如何在golang中使用Logrus
分享鏈接:http://weahome.cn/article/ipihii.html

其他資訊

在線(xiàn)咨詢(xún)

微信咨詢(xún)

電話(huà)咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部