A-Tune/common/log/log.go
Zhipeng Xie 4335408875 atune: init code
upload code to gitee

Signed-off-by: Zhipeng Xie <xiezhipeng1@huawei.com>
2019-11-13 17:14:15 +08:00

253 lines
6.1 KiB
Go

/*
* Copyright (c) 2019 Huawei Technologies Co., Ltd.
* A-Tune is licensed under the Mulan PSL v1.
* You can use this software according to the terms and conditions of the Mulan PSL v1.
* You may obtain a copy of Mulan PSL v1 at:
* http://license.coscl.org.cn/MulanPSL
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
* PURPOSE.
* See the Mulan PSL v1 for more details.
* Create: 2019-10-29
*/
package log
import (
"fmt"
"log/syslog"
"os"
"path/filepath"
"runtime"
"github.com/go-ini/ini"
logrus "github.com/sirupsen/logrus"
logrus_syslog "github.com/sirupsen/logrus/hooks/syslog"
)
type logger struct {
entry *logrus.Entry
}
var rootLogger = logrus.New()
var baseLogger = logger{entry: logrus.NewEntry(rootLogger)}
var logLevels = map[string]logrus.Level{
"panic": logrus.PanicLevel,
"fatal": logrus.FatalLevel,
"error": logrus.ErrorLevel,
"warn": logrus.WarnLevel,
"info": logrus.InfoLevel,
"debug": logrus.DebugLevel,
"trace": logrus.TraceLevel,
}
// InitLogger method init the base logger
func InitLogger(modes []string, logPath string, cfg *ini.File) error {
sec, err := cfg.GetSection("log")
if err != nil {
return err
}
formatter := getLogFormat("text")
baseLogger.SetLevel(sec.Key("level").MustString("info"))
for _, mode := range modes {
switch mode {
case "console":
baseLogger.entry.Logger.Out = os.Stdout
baseLogger.entry.Logger.Formatter = formatter
case "syslog":
syslogHook, err := logrus_syslog.NewSyslogHook("", "", syslog.LOG_INFO, "atuned")
if err != nil {
baseLogger.Errorf("syslog hook init faild:%v", err)
}
baseLogger.entry.Logger.AddHook(syslogHook)
}
}
return nil
}
func (log logger) withFileField() *logrus.Entry {
filename, line := "???", 0
_, filename, line, ok := runtime.Caller(2)
if ok {
filename = filepath.Base(filename)
}
return log.entry.WithField("file", fmt.Sprintf("%s:%d", filename, line))
}
func (log logger) With(key string, value interface{}) Logger {
return logger{log.entry.WithField(key, value)}
}
func (log logger) Debug(args ...interface{}) {
log.withFileField().Debug(args...)
}
func (log logger) Debugln(args ...interface{}) {
log.withFileField().Debugln(args...)
}
func (log logger) Debugf(format string, args ...interface{}) {
log.withFileField().Debugf(format, args...)
}
func (log logger) Info(args ...interface{}) {
log.withFileField().Info(args...)
}
func (log logger) Infoln(args ...interface{}) {
log.withFileField().Infoln(args...)
}
func (log logger) Infof(format string, args ...interface{}) {
log.withFileField().Infof(format, args...)
}
func (log logger) Warn(args ...interface{}) {
log.withFileField().Warn(args...)
}
func (log logger) Warnln(args ...interface{}) {
log.withFileField().Warnln(args...)
}
func (log logger) Warnf(format string, args ...interface{}) {
log.withFileField().Warnf(format, args...)
}
func (log logger) Error(args ...interface{}) {
log.withFileField().Error(args...)
}
func (log logger) Errorln(args ...interface{}) {
log.withFileField().Errorln(args...)
}
func (log logger) Errorf(format string, args ...interface{}) {
log.withFileField().Errorf(format, args...)
}
func (log logger) Fatal(args ...interface{}) {
log.withFileField().Fatal(args...)
}
func (log logger) Fatalln(args ...interface{}) {
log.withFileField().Fatalln(args...)
}
func (log logger) Fatalf(format string, args ...interface{}) {
log.withFileField().Fatalf(format, args...)
}
func (log logger) SetLevel(level string) error {
lev, err := logrus.ParseLevel(level)
if err != nil {
return err
}
log.entry.Logger.SetLevel(lev)
return nil
}
// GetLogger method return the root logger of the logger service
func GetLogger() *logrus.Logger {
return rootLogger
}
func getLogFormat(format string) logrus.Formatter {
switch format {
case "text":
return &logrus.TextFormatter{}
case "json":
return &logrus.JSONFormatter{}
default:
return &logrus.TextFormatter{}
}
}
// Debug method log debug level args
func Debug(args ...interface{}) {
baseLogger.withFileField().Debug(args...)
}
// Debugln method log debug level args
func Debugln(args ...interface{}) {
baseLogger.withFileField().Debugln(args...)
}
// Debugf method log debug level message with format string
func Debugf(format string, args ...interface{}) {
baseLogger.withFileField().Debugf(format, args...)
}
// Info method log info level args
func Info(args ...interface{}) {
baseLogger.withFileField().Info(args...)
}
// Infoln method log info level args
func Infoln(args ...interface{}) {
baseLogger.withFileField().Infoln(args...)
}
// Infof method log info level message with format string
func Infof(format string, args ...interface{}) {
baseLogger.withFileField().Infof(format, args...)
}
// Warn method log warn args
func Warn(args ...interface{}) {
baseLogger.withFileField().Warn(args...)
}
// Warnln method log warn args
func Warnln(args ...interface{}) {
baseLogger.withFileField().Warnln(args...)
}
// Warnf method log warn level message with format string
func Warnf(format string, args ...interface{}) {
baseLogger.withFileField().Warnf(format, args...)
}
// Error method log error args
func Error(args ...interface{}) {
baseLogger.withFileField().Error(args...)
}
// Errorln method log error args
func Errorln(args ...interface{}) {
baseLogger.withFileField().Errorln(args...)
}
// Errorf method log error level message with format string
func Errorf(format string, args ...interface{}) {
baseLogger.withFileField().Errorf(format, args...)
}
// Fatal method log fatal info
func Fatal(args ...interface{}) {
baseLogger.withFileField().Fatal(args...)
}
// Fatalln method log fatal info
func Fatalln(args ...interface{}) {
baseLogger.withFileField().Fatalln(args...)
}
// Fatalf method log fatal level message with format string
func Fatalf(format string, args ...interface{}) {
baseLogger.withFileField().Fatalf(format, args...)
}
// WithField method add field to logger
func WithField(key string, value interface{}) Logger {
return baseLogger.With(key, value)
}