GAAS GFrame项目web后台
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

218 lines
4.6 KiB

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)
}
}