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()
|
|
|
|
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 nil, 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 nil, 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 nil, err
|
|
}
|
|
innerLog.output = append(innerLog.output, driver)
|
|
}
|
|
}
|
|
if len(innerLog.output) == 0 {
|
|
return nil, errors.New("未获取到日志输出驱动")
|
|
}
|
|
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)
|
|
}
|
|
}
|