package logger import ( "errors" json "github.com/json-iterator/go" "sync" ) var ( lock sync.Mutex // 全局log接口map loggerMap map[string]Log ) type logger struct { module string pid int operator string output []driver // 输出驱动列表 } // log 接口 type Log interface { Debug(content string, extra ...interface{}) Info(content string, extra ...interface{}) Warn(content string, extra ...interface{}) Error(content string, extra ...interface{}) Fatal(content string, extra ...interface{}) } // 获取log接口 func NewLogger(operator string, module string) (Log, error) { lock.Lock() defer lock.Unlock() if loggerMap == nil { loggerMap = make(map[string]Log) } if loggerMap[module] != nil { return loggerMap[module], nil } return initLogger(module, operator) } // 根据全局配置初始化log接口 func initLogger(module string, operator string) (Log, error) { pid := getPid() defaultLogger := NewDefaultLogger() innerLog := &logger{ module: module, pid: pid, operator: operator, output: make([]driver, 0), } // 若没有module配置使用root配置 config, exist := loggerConfig.Config[module] if !exist { config = loggerConfig.Config["root"] } for _, value := range config { levelInt := changeToInt(value.Level) // 初始化db driver if value.DriverType == "db" { driverConfig, exist := outputConfig.DB[value.DriverName] if !exist { continue } switch driverConfig.DBType { case "mongo": driver, err := NewMongoDriver(driverConfig, levelInt) if err != nil { return defaultLogger, err } innerLog.output = append(innerLog.output, driver) } } else if value.DriverType == "file" { // 初始话file driver driverConfig, exist := outputConfig.File[value.DriverName] if !exist { continue } driver, err := NewFileDriver(driverConfig, levelInt) if err != nil { return defaultLogger, err } innerLog.output = append(innerLog.output, driver) } else if value.DriverType == "console" { // 初始化console driver driverConfig := outputConfig.Console driver, err := NewConsoleDriver(driverConfig) if err != nil { return defaultLogger, err } innerLog.output = append(innerLog.output, driver) } } if len(innerLog.output) == 0 { return defaultLogger, errors.New("未获取到日志输出驱动") } loggerMap[module] = innerLog return innerLog, nil } func (l *logger) Debug(content string, extra ...interface{}) { date := getToday() t := getCurrentTime() caller := getCaller(2) extraStr, err := json.Marshal(extra) if err != nil { return } message := message{ Level: DebugLevel, Module: l.module, Content: content, Date: date, Time: t, Caller: caller, Extra: string(extraStr), Pid: l.pid, Operator: l.operator, } for _, driver := range l.output { driver.Record(message) } } func (l *logger) Info(content string, extra ...interface{}) { date := getToday() t := getCurrentTime() caller := getCaller(2) extraStr, err := json.Marshal(extra) if err != nil { return } message := message{ Level: infoLevel, Module: l.module, Content: content, Date: date, Time: t, Caller: caller, Extra: string(extraStr), Pid: l.pid, Operator: l.operator, } for _, driver := range l.output { driver.Record(message) } } func (l *logger) Warn(content string, extra ...interface{}) { date := getToday() t := getCurrentTime() caller := getCaller(2) extraStr, err := json.Marshal(extra) if err != nil { return } message := message{ Level: WarnLevel, Module: l.module, Content: content, Date: date, Time: t, Caller: caller, Extra: string(extraStr), Pid: l.pid, Operator: l.operator, } for _, driver := range l.output { driver.Record(message) } } func (l *logger) Error(content string, extra ...interface{}) { date := getToday() t := getCurrentTime() caller := getCaller(2) extraStr, err := json.Marshal(extra) if err != nil { return } message := message{ Level: ErrorLevel, Module: l.module, Content: content, Date: date, Time: t, Caller: caller, Extra: string(extraStr), Pid: l.pid, Operator: l.operator, } for _, driver := range l.output { driver.Record(message) } } func (l *logger) Fatal(content string, extra ...interface{}) { date := getToday() t := getCurrentTime() caller := getCaller(2) extraStr, err := json.Marshal(extra) if err != nil { return } message := message{ Level: FatalLevel, Module: l.module, Content: content, Date: date, Time: t, Caller: caller, Extra: string(extraStr), Pid: l.pid, Operator: l.operator, } for _, driver := range l.output { driver.Record(message) } }