|
@@ -9,28 +9,39 @@ import (
|
|
"path/filepath"
|
|
"path/filepath"
|
|
"strings"
|
|
"strings"
|
|
|
|
|
|
|
|
+ "github.com/pkg/errors"
|
|
|
|
+ "gopkg.in/ini.v1"
|
|
log "unknwon.dev/clog/v2"
|
|
log "unknwon.dev/clog/v2"
|
|
)
|
|
)
|
|
|
|
|
|
-// Log settings
|
|
|
|
-var Log struct {
|
|
|
|
|
|
+type loggerConf struct {
|
|
|
|
+ Buffer int64
|
|
|
|
+ Config interface{}
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+type logConf struct {
|
|
RootPath string
|
|
RootPath string
|
|
Modes []string
|
|
Modes []string
|
|
- Configs []interface{}
|
|
|
|
|
|
+ Configs []*loggerConf
|
|
}
|
|
}
|
|
|
|
|
|
-// InitLogging initializes the logging service of the application.
|
|
|
|
-func InitLogging() {
|
|
|
|
- Log.RootPath = File.Section("log").Key("ROOT_PATH").MustString(filepath.Join(WorkDir(), "log"))
|
|
|
|
-
|
|
|
|
- // Because we always create a console logger as the primary logger at init time,
|
|
|
|
- // we need to remove it in case the user doesn't configure to use it after the
|
|
|
|
- // logging service is initalized.
|
|
|
|
- hasConsole := false
|
|
|
|
|
|
+// Log settings
|
|
|
|
+var Log *logConf
|
|
|
|
+
|
|
|
|
+// initLogConf returns parsed logging configuration from given INI file.
|
|
|
|
+// NOTE: Because we always create a console logger as the primary logger at init time,
|
|
|
|
+// we need to remove it in case the user doesn't configure to use it after the logging
|
|
|
|
+// service is initalized.
|
|
|
|
+func initLogConf(cfg *ini.File) (_ *logConf, hasConsole bool, _ error) {
|
|
|
|
+ rootPath := cfg.Section("log").Key("ROOT_PATH").MustString(filepath.Join(WorkDir(), "log"))
|
|
|
|
+ modes := strings.Split(cfg.Section("log").Key("MODE").MustString("console"), ",")
|
|
|
|
+ lc := &logConf{
|
|
|
|
+ RootPath: ensureAbs(rootPath),
|
|
|
|
+ Modes: make([]string, 0, len(modes)),
|
|
|
|
+ Configs: make([]*loggerConf, 0, len(modes)),
|
|
|
|
+ }
|
|
|
|
|
|
// Iterate over [log.*] sections to initialize individual logger.
|
|
// Iterate over [log.*] sections to initialize individual logger.
|
|
- Log.Modes = strings.Split(File.Section("log").Key("MODE").MustString("console"), ",")
|
|
|
|
- Log.Configs = make([]interface{}, 0, len(Log.Modes))
|
|
|
|
levelMappings := map[string]log.Level{
|
|
levelMappings := map[string]log.Level{
|
|
"trace": log.LevelTrace,
|
|
"trace": log.LevelTrace,
|
|
"info": log.LevelInfo,
|
|
"info": log.LevelInfo,
|
|
@@ -39,43 +50,30 @@ func InitLogging() {
|
|
"fatal": log.LevelFatal,
|
|
"fatal": log.LevelFatal,
|
|
}
|
|
}
|
|
|
|
|
|
- type config struct {
|
|
|
|
- Buffer int64
|
|
|
|
- Config interface{}
|
|
|
|
- }
|
|
|
|
- for _, mode := range Log.Modes {
|
|
|
|
- mode = strings.ToLower(strings.TrimSpace(mode))
|
|
|
|
- secName := "log." + mode
|
|
|
|
- sec, err := File.GetSection(secName)
|
|
|
|
|
|
+ for i := range modes {
|
|
|
|
+ modes[i] = strings.ToLower(strings.TrimSpace(modes[i]))
|
|
|
|
+ secName := "log." + modes[i]
|
|
|
|
+ sec, err := cfg.GetSection(secName)
|
|
if err != nil {
|
|
if err != nil {
|
|
- log.Fatal("Missing configuration section [%s] for %q logger", secName, mode)
|
|
|
|
- return
|
|
|
|
|
|
+ return nil, hasConsole, errors.Errorf("missing configuration section [%s] for %q logger", secName, modes[i])
|
|
}
|
|
}
|
|
|
|
|
|
level := levelMappings[strings.ToLower(sec.Key("LEVEL").MustString("trace"))]
|
|
level := levelMappings[strings.ToLower(sec.Key("LEVEL").MustString("trace"))]
|
|
buffer := sec.Key("BUFFER_LEN").MustInt64(100)
|
|
buffer := sec.Key("BUFFER_LEN").MustInt64(100)
|
|
- var c *config
|
|
|
|
- switch mode {
|
|
|
|
|
|
+ var c *loggerConf
|
|
|
|
+ switch modes[i] {
|
|
case log.DefaultConsoleName:
|
|
case log.DefaultConsoleName:
|
|
hasConsole = true
|
|
hasConsole = true
|
|
- c = &config{
|
|
|
|
|
|
+ c = &loggerConf{
|
|
Buffer: buffer,
|
|
Buffer: buffer,
|
|
Config: log.ConsoleConfig{
|
|
Config: log.ConsoleConfig{
|
|
Level: level,
|
|
Level: level,
|
|
},
|
|
},
|
|
}
|
|
}
|
|
- err = log.NewConsole(c.Buffer, c.Config)
|
|
|
|
|
|
|
|
case log.DefaultFileName:
|
|
case log.DefaultFileName:
|
|
- logPath := filepath.Join(Log.RootPath, "gogs.log")
|
|
|
|
- logDir := filepath.Dir(logPath)
|
|
|
|
- err = os.MkdirAll(logDir, os.ModePerm)
|
|
|
|
- if err != nil {
|
|
|
|
- log.Fatal("Failed to create log directory %q: %v", logDir, err)
|
|
|
|
- return
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- c = &config{
|
|
|
|
|
|
+ logPath := filepath.Join(lc.RootPath, "gogs.log")
|
|
|
|
+ c = &loggerConf{
|
|
Buffer: buffer,
|
|
Buffer: buffer,
|
|
Config: log.FileConfig{
|
|
Config: log.FileConfig{
|
|
Level: level,
|
|
Level: level,
|
|
@@ -89,20 +87,18 @@ func InitLogging() {
|
|
},
|
|
},
|
|
},
|
|
},
|
|
}
|
|
}
|
|
- err = log.NewFile(c.Buffer, c.Config)
|
|
|
|
|
|
|
|
case log.DefaultSlackName:
|
|
case log.DefaultSlackName:
|
|
- c = &config{
|
|
|
|
|
|
+ c = &loggerConf{
|
|
Buffer: buffer,
|
|
Buffer: buffer,
|
|
Config: log.SlackConfig{
|
|
Config: log.SlackConfig{
|
|
Level: level,
|
|
Level: level,
|
|
URL: sec.Key("URL").String(),
|
|
URL: sec.Key("URL").String(),
|
|
},
|
|
},
|
|
}
|
|
}
|
|
- err = log.NewSlack(c.Buffer, c.Config)
|
|
|
|
|
|
|
|
case log.DefaultDiscordName:
|
|
case log.DefaultDiscordName:
|
|
- c = &config{
|
|
|
|
|
|
+ c = &loggerConf{
|
|
Buffer: buffer,
|
|
Buffer: buffer,
|
|
Config: log.DiscordConfig{
|
|
Config: log.DiscordConfig{
|
|
Level: level,
|
|
Level: level,
|
|
@@ -110,22 +106,62 @@ func InitLogging() {
|
|
Username: sec.Key("USERNAME").String(),
|
|
Username: sec.Key("USERNAME").String(),
|
|
},
|
|
},
|
|
}
|
|
}
|
|
- err = log.NewDiscord(c.Buffer, c.Config)
|
|
|
|
|
|
|
|
default:
|
|
default:
|
|
continue
|
|
continue
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ lc.Modes = append(lc.Modes, modes[i])
|
|
|
|
+ lc.Configs = append(lc.Configs, c)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return lc, hasConsole, nil
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// InitLogging initializes the logging service of the application.
|
|
|
|
+func InitLogging() {
|
|
|
|
+ logConf, hasConsole, err := initLogConf(File)
|
|
|
|
+ if err != nil {
|
|
|
|
+ log.Fatal("Failed to init logging configuration: %v", err)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ err = os.MkdirAll(logConf.RootPath, os.ModePerm)
|
|
|
|
+ if err != nil {
|
|
|
|
+ log.Fatal("Failed to create log directory: %v", err)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ for i, mode := range logConf.Modes {
|
|
|
|
+ c := logConf.Configs[i]
|
|
|
|
+
|
|
|
|
+ var err error
|
|
|
|
+ var level log.Level
|
|
|
|
+ switch mode {
|
|
|
|
+ case log.DefaultConsoleName:
|
|
|
|
+ level = c.Config.(log.ConsoleConfig).Level
|
|
|
|
+ err = log.NewConsole(c.Buffer, c.Config)
|
|
|
|
+ case log.DefaultFileName:
|
|
|
|
+ level = c.Config.(log.FileConfig).Level
|
|
|
|
+ err = log.NewFile(c.Buffer, c.Config)
|
|
|
|
+ case log.DefaultSlackName:
|
|
|
|
+ level = c.Config.(log.SlackConfig).Level
|
|
|
|
+ err = log.NewSlack(c.Buffer, c.Config)
|
|
|
|
+ case log.DefaultDiscordName:
|
|
|
|
+ level = c.Config.(log.DiscordConfig).Level
|
|
|
|
+ err = log.NewDiscord(c.Buffer, c.Config)
|
|
|
|
+ default:
|
|
|
|
+ panic("unreachable")
|
|
|
|
+ }
|
|
|
|
+
|
|
if err != nil {
|
|
if err != nil {
|
|
log.Fatal("Failed to init %s logger: %v", mode, err)
|
|
log.Fatal("Failed to init %s logger: %v", mode, err)
|
|
return
|
|
return
|
|
}
|
|
}
|
|
-
|
|
|
|
- Log.Configs = append(Log.Configs, c)
|
|
|
|
log.Trace("Log mode: %s (%s)", strings.Title(mode), strings.Title(strings.ToLower(level.String())))
|
|
log.Trace("Log mode: %s (%s)", strings.Title(mode), strings.Title(strings.ToLower(level.String())))
|
|
}
|
|
}
|
|
|
|
|
|
if !hasConsole {
|
|
if !hasConsole {
|
|
log.Remove(log.DefaultConsoleName)
|
|
log.Remove(log.DefaultConsoleName)
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ Log = logConf
|
|
}
|
|
}
|