Kafka, Console, 파일(파일 구분, 백업 지원)으로 동시에 Uber 로그 zap 출력
var Logger *zap.Logger
type LogKafka struct {
Producer sarama.SyncProducer
Topic string
}
func (lk *LogKafka) Write(p []byte) (n int, err error) {
msg := &sarama.ProducerMessage{}
msg.Topic = lk.Topic
msg.Value = sarama.ByteEncoder(p)
_, _, err = lk.Producer.SendMessage(msg)
if err != nil {
return
}
return
}
func InitLogger(mode string, fileName string, maxSize, maxBackups, maxAge int, compress bool, enableKafka bool, kafkaAddress []string) {
//
highPriority := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool {
return lvl >= zapcore.ErrorLevel
})
//
lowPriority := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool {
return lvl >= zapcore.DebugLevel
})
var allCore []zapcore.Core
hook := lumberjack.Logger{
Filename: fileName,
MaxSize: maxSize, // megabytes
MaxBackups: maxBackups,
MaxAge: maxAge, //days
Compress: compress, // disabled by default
}
fileWriter := zapcore.AddSync(&hook)
// High-priority output should also go to standard error, and low-priority
// output should also go to standard out.
consoleDebugging := zapcore.Lock(os.Stdout)
// for human operators.
consoleEncoder := zapcore.NewConsoleEncoder(zap.NewDevelopmentEncoderConfig())
// Join the outputs, encoders, and level-handling functions into
// zapcore.Cores, then tee the four cores together.
// kafka
if len(kafkaAddress) > 0 && enableKafka {
var (
kl LogKafka
err error
)
kl.Topic = "go_framework_log"
// Kafka
config := sarama.NewConfig()
//
config.Producer.RequiredAcks = sarama.WaitForAll
//
config.Producer.Partitioner = sarama.NewRandomPartitioner
// , RequireAcks NoReponse .
config.Producer.Return.Successes = true
config.Producer.Return.Errors = true
kl.Producer, err = sarama.NewSyncProducer(kafkaAddress, config)
if err != nil {
fmt.Printf("connect kafka failed: %+v
", err)
os.Exit(-1)
}
topicErrors := zapcore.AddSync(&kl)
// kafka
kafkaEncoder := zapcore.NewJSONEncoder(zap.NewDevelopmentEncoderConfig())
var kafkaCore zapcore.Core
if mode == "debug" {
kafkaCore = zapcore.NewCore(kafkaEncoder, topicErrors, lowPriority)
} else {
kafkaCore = zapcore.NewCore(kafkaEncoder, topicErrors, highPriority)
}
allCore = append(allCore, kafkaCore)
}
if mode == "debug" {
allCore = append(allCore, zapcore.NewCore(consoleEncoder, consoleDebugging, lowPriority))
}
allCore = append(allCore, zapcore.NewCore(consoleEncoder, fileWriter, highPriority))
core := zapcore.NewTee(allCore...)
// From a zapcore.Core, it's easy to construct a Logger.
Logger = zap.New(core).WithOptions(zap.AddCaller())
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.