第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

github.com/rs/zerolog 字段的延遲評(píng)估

github.com/rs/zerolog 字段的延遲評(píng)估

Go
素胚勾勒不出你 2023-02-06 18:40:49
介紹零日志字段我github.com/rs/zerolog在我的 golang 項(xiàng)目中使用。我知道我可以使用類似這樣的方法將字段添加到輸出中: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`}但是我想要的是在行的運(yùn)行時(shí)評(píng)估logger.Info("a regular log output")字段的值是什么myIntField。那個(gè)設(shè)定我有一個(gè)帶有 go-routines 的生產(chǎn)者/消費(fèi)者設(shè)置(例如參見(jiàn)https://goplay.tools/snippet/hkoMAwqKcwj),我有兩個(gè)整數(shù),它們自動(dòng)計(jì)算仍在運(yùn)行的消費(fèi)者和生產(chǎn)者 go-routines 的數(shù)量。在拆除消費(fèi)者和生產(chǎn)者后,我想在運(yùn)行時(shí)顯示這些數(shù)字。這是使用 log 而不是 zerolog 時(shí)的代碼: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()}但是,如果我想始終在每個(gè)日志行中打印當(dāng)前活躍的消費(fèi)者/生產(chǎn)者的數(shù)量怎么辦?
查看完整描述

2 回答

?
慕斯709654

TA貢獻(xiàn)1840條經(jīng)驗(yàn) 獲得超5個(gè)贊

您可以添加一個(gè)掛鉤。為每個(gè)日志記錄事件評(píng)估掛鉤

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在調(diào)用之間保存指針Hook.Run


可能對(duì)你HookFunc來(lái)說(shuō)更好一些。它是為每個(gè)事件調(diào)用的無(wú)狀態(tài)函數(shù)。以下是為每條消息調(diào)用 PRNG 的函數(shù)掛鉤示例: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"}


查看完整回答
反對(duì) 回復(fù) 2023-02-06
?
largeQ

TA貢獻(xiàn)2039條經(jīng)驗(yàn) 獲得超8個(gè)贊

您可以使用zerolog Hook來(lái)實(shí)現(xiàn)這一點(diǎn)。掛鉤是帶有Run方法的接口,該方法在將事件數(shù)據(jù)寫(xiě)入給定io.Writer(在您的情況下os.Stderr)之前被調(diào)用。


這是一些示例代碼:


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

}

您將使用計(jì)數(shù)器的inc和dec方法來(lái)修改運(yùn)行的消費(fèi)者/生產(chǎn)者的數(shù)量。


查看完整回答
反對(duì) 回復(fù) 2023-02-06
  • 2 回答
  • 0 關(guān)注
  • 127 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)