rlog/log.go (178 lines of code) (raw):

/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package rlog import ( "os" "path/filepath" "strings" "gopkg.in/natefinch/lumberjack.v2" "github.com/sirupsen/logrus" ) const ( LogKeyProducerGroup = "producerGroup" LogKeyConsumerGroup = "consumerGroup" LogKeyTopic = "topic" LogKeyMessageQueue = "MessageQueue" LogKeyAllocateMessageQueue = "AllocateMessageQueue" LogKeyUnderlayError = "underlayError" LogKeyBroker = "broker" LogKeyValueChangedFrom = "changedFrom" LogKeyValueChangedTo = "changeTo" LogKeyPullRequest = "PullRequest" LogKeyTimeStamp = "timestamp" LogKeyMessageId = "msgId" LogKeyStoreHost = "storeHost" LogKeyQueueId = "queueId" LogKeyQueueOffset = "queueOffset" LogKeyMessages = "messages" LogKeyStack = "stack" ) type Logger interface { Debug(msg string, fields map[string]interface{}) Info(msg string, fields map[string]interface{}) Warning(msg string, fields map[string]interface{}) Error(msg string, fields map[string]interface{}) Fatal(msg string, fields map[string]interface{}) Level(level string) OutputPath(path string) (err error) } func init() { r := &defaultLogger{ logger: logrus.New(), } level := os.Getenv("ROCKETMQ_GO_LOG_LEVEL") switch strings.ToLower(level) { case "debug": r.logger.SetLevel(logrus.DebugLevel) case "warn": r.logger.SetLevel(logrus.WarnLevel) case "error": r.logger.SetLevel(logrus.ErrorLevel) case "fatal": r.logger.SetLevel(logrus.FatalLevel) default: r.logger.SetLevel(logrus.InfoLevel) } rLog = r } var rLog Logger type defaultLogger struct { logger *logrus.Logger } func (l *defaultLogger) Debug(msg string, fields map[string]interface{}) { if msg == "" && len(fields) == 0 { return } l.logger.WithFields(fields).Debug(msg) } func (l *defaultLogger) Info(msg string, fields map[string]interface{}) { if msg == "" && len(fields) == 0 { return } l.logger.WithFields(fields).Info(msg) } func (l *defaultLogger) Warning(msg string, fields map[string]interface{}) { if msg == "" && len(fields) == 0 { return } l.logger.WithFields(fields).Warning(msg) } func (l *defaultLogger) Error(msg string, fields map[string]interface{}) { if msg == "" && len(fields) == 0 { return } l.logger.WithFields(fields).Error(msg) } func (l *defaultLogger) Fatal(msg string, fields map[string]interface{}) { if msg == "" && len(fields) == 0 { return } l.logger.WithFields(fields).Fatal(msg) } func (l *defaultLogger) Level(level string) { switch strings.ToLower(level) { case "debug": l.logger.SetLevel(logrus.DebugLevel) case "warn": l.logger.SetLevel(logrus.WarnLevel) case "error": l.logger.SetLevel(logrus.ErrorLevel) case "fatal": l.logger.SetLevel(logrus.FatalLevel) default: l.logger.SetLevel(logrus.InfoLevel) } } type Config struct { OutputPath string MaxFileSizeMB int MaxBackups int MaxAges int Compress bool LocalTime bool } func (c *Config) Logger() *lumberjack.Logger { return &lumberjack.Logger{ Filename: filepath.ToSlash(c.OutputPath), MaxSize: c.MaxFileSizeMB, // MB MaxBackups: c.MaxBackups, MaxAge: c.MaxAges, // days Compress: c.Compress, // disabled by default LocalTime: c.LocalTime, } } const defaultLogPath = "/tmp/rocketmq-client.log" func defaultConfig() Config { return Config{ OutputPath: defaultLogPath, MaxFileSizeMB: 10, MaxBackups: 5, MaxAges: 3, Compress: false, LocalTime: true, } } func (l *defaultLogger) Config(conf Config) (err error) { l.logger.Out = conf.Logger() return } func (l *defaultLogger) OutputPath(path string) (err error) { config := defaultConfig() config.OutputPath = path l.logger.Out = config.Logger() return } // SetLogger use specified logger user customized, in general, we suggest user to replace the default logger with specified func SetLogger(logger Logger) { rLog = logger } func SetLogLevel(level string) { if level == "" { return } rLog.Level(level) } func SetOutputPath(path string) (err error) { if "" == path { return } return rLog.OutputPath(path) } func Debug(msg string, fields map[string]interface{}) { rLog.Debug(msg, fields) } func Info(msg string, fields map[string]interface{}) { if msg == "" && len(fields) == 0 { return } rLog.Info(msg, fields) } func Warning(msg string, fields map[string]interface{}) { if msg == "" && len(fields) == 0 { return } rLog.Warning(msg, fields) } func Error(msg string, fields map[string]interface{}) { rLog.Error(msg, fields) } func Fatal(msg string, fields map[string]interface{}) { rLog.Fatal(msg, fields) }