亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

github.com/rs/zerolog 字段的延遲評估

github.com/rs/zerolog 字段的延遲評估

Go
素胚勾勒不出你 2023-02-06 18:40:49
介紹零日志字段我github.com/rs/zerolog在我的 golang 項目中使用。我知道我可以使用類似這樣的方法將字段添加到輸出中:package mainimport (    "os"    "github.com/rs/zerolog")func main() {    logger := zerolog.New(os.Stderr).With().Timestamp().Logger()    logger.Int("myIntField", 42)    logger.Info("a regular log output") // this log entry will also contain the integer field `myIntField`}但是我想要的是在行的運行時評估logger.Info("a regular log output")字段的值是什么myIntField。那個設定我有一個帶有 go-routines 的生產者/消費者設置(例如參見https://goplay.tools/snippet/hkoMAwqKcwj),我有兩個整數,它們自動計算仍在運行的消費者和生產者 go-routines 的數量。在拆除消費者和生產者后,我想在運行時顯示這些數字。這是使用 log 而不是 zerolog 時的代碼:package mainimport (    "fmt"    "log"    "os"    "sync"    "sync/atomic")func main() {    numProducers := int32(3)    numConsumers := int32(3)    producersRunning := numProducers    consumersRunning := numConsumers    var wg sync.WaitGroup    l := log.New(os.Stderr, "", 0)    // producers    for i := int32(0); i < numProducers; i++ {        idx := i        wg.Add(1)        go (func() {            // producer tear down            defer func() {                atomic.AddInt32(&producersRunning, -1)                l.Printf("producer-%3d . producersRunning: %3d\n", idx, producersRunning)                wg.Done()            }()            // this is where the actual producer works is happening        })()    }    // consumers    for i := int32(0); i < numConsumers; i++ {        idx := i        wg.Add(1)        go (func() {            // consumer tear down            defer func() {                atomic.AddInt32(&consumersRunning, -1)                l.Printf("consumer-%3d . consumersRunning: %3d\n", idx, consumersRunning)                wg.Done()            }()            // this is where the actual consumer works is happening        })()    }    fmt.Println("waiting")    wg.Wait()}但是,如果我想始終在每個日志行中打印當前活躍的消費者/生產者的數量怎么辦?
查看完整描述

2 回答

?
慕斯709654

TA貢獻1840條經驗 獲得超5個贊

您可以添加一個掛鉤。為每個日志記錄事件評估掛鉤

https://go.dev/play/p/Q7doafJGaeE

package main


import (

    "os"


    "github.com/rs/zerolog"

)


type IntHook struct {

    Count int

}


func (h *IntHook) Run(e *zerolog.Event, l zerolog.Level, msg string) {

    e.Int("count", h.Count)

    h.Count++

}


func main() {

    var intHook IntHook

    log := zerolog.New(os.Stdout).Hook(&intHook)


    log.Info().Msg("hello world")

    log.Info().Msg("hello world one more time")

}

輸出是


{"level":"info","count":0,"message":"hello world"}

{"level":"info","count":1,"message":"hello world one more time"}

需要Count在調用之間保存指針Hook.Run


可能對你HookFunc來說更好一些。它是為每個事件調用的無狀態函數。以下是為每條消息調用 PRNG 的函數掛鉤示例:https ://go.dev/play/p/xu6aXpUmE0v


package main


import (

    "math/rand"

    "os"


    "github.com/rs/zerolog"

)


func RandomHook(e *zerolog.Event, l zerolog.Level, msg string) {

    e.Int("random", rand.Intn(100))

}


func main() {

    var randomHook zerolog.HookFunc = RandomHook

    log := zerolog.New(os.Stdout).Hook(randomHook)


    log.Info().Msg("hello world")

    log.Info().Msg("hello world one more time")

}

輸出


{"level":"info","random":81,"message":"hello world"}

{"level":"info","random":87,"message":"hello world one more time"}


查看完整回答
反對 回復 2023-02-06
?
largeQ

TA貢獻2039條經驗 獲得超8個贊

您可以使用zerolog Hook來實現這一點。掛鉤是帶有Run方法的接口,該方法在將事件數據寫入給定io.Writer(在您的情況下os.Stderr)之前被調用。


這是一些示例代碼:


type counter struct {

    name string

    value int32

}


func (c *counter) inc() { atomic.AddInt32(&c.value, 1) }

func (c *counter) dec() { atomic.AddInt32(&c.value, -1) }

func (c *counter) get() { atomic.LoadInt32(&c.value) }


func (c *counter) Run(e *zerolog.Event, _ zerolog.Level, _ string) {

    e.Int32(c.name, c.get())

}


int main() {

    numConsumers, numProducers := 3, 3


    consumersRunning := &counter{

        name: "consumersRunning",

        value: int32(numConsumers),

    }

    producersRunning := &counter{

        name: "producersRunning",

        value: int32(numProducers),

    }

    

    logger := zerolog.New(os.Stderr)

    consumerLogger := logger.With().Str("is", "consumer").Logger().Hook(consumersRunning)

    producerLogger := logger.With().Str("is", "producer").Logger().Hook(producersRunning)


    // your other code

}

您將使用計數器的inc和dec方法來修改運行的消費者/生產者的數量。


查看完整回答
反對 回復 2023-02-06
  • 2 回答
  • 0 關注
  • 140 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號