2 回答

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"}

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ù)量。
- 2 回答
- 0 關(guān)注
- 127 瀏覽
添加回答
舉報(bào)