From ec814085d468762c52d0e2438fdaddfdfae1ee58 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Tue, 15 Nov 2016 11:28:03 +0800 Subject: [PATCH 1/4] make xorm log configable --- cmd/admin.go | 2 + cmd/serve.go | 2 +- models/models.go | 15 +---- modules/log/xorm.go | 113 +++++++++++++++++++++++++++++++++++++ modules/setting/setting.go | 81 ++++++++++++++++++++++++++ 5 files changed, 200 insertions(+), 13 deletions(-) create mode 100644 modules/log/xorm.go diff --git a/cmd/admin.go b/cmd/admin.go index f4782195e4541..6985044243d57 100644 --- a/cmd/admin.go +++ b/cmd/admin.go @@ -74,6 +74,8 @@ func runCreateUser(c *cli.Context) error { setting.NewContext() models.LoadConfigs() + + setting.NewXORMLogService(false) if err := models.SetEngine(); err != nil { return fmt.Errorf("models.SetEngine: %v", err) } diff --git a/cmd/serve.go b/cmd/serve.go index c69254e3f5d31..7141d85c92c8f 100644 --- a/cmd/serve.go +++ b/cmd/serve.go @@ -50,7 +50,6 @@ var CmdServ = cli.Command{ func setup(logPath string) error { setting.NewContext() log.NewGitLogger(filepath.Join(setting.LogRootPath, logPath)) - models.LoadConfigs() if setting.UseSQLite3 || setting.UseTiDB { @@ -60,6 +59,7 @@ func setup(logPath string) error { } } + setting.NewXORMLogService(true) return models.SetEngine() } diff --git a/models/models.go b/models/models.go index 27b49755aa9b0..4ec4750fb9128 100644 --- a/models/models.go +++ b/models/models.go @@ -25,6 +25,7 @@ import ( _ "github.com/denisenkom/go-mssqldb" "code.gitea.io/gitea/models/migrations" + "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/setting" ) @@ -226,6 +227,7 @@ func getEngine() (*xorm.Engine, error) { default: return nil, fmt.Errorf("Unknown database type: %s", DbCfg.Type) } + return xorm.NewEngine(DbCfg.Type, connStr) } @@ -248,20 +250,9 @@ func SetEngine() (err error) { } x.SetMapper(core.GonicMapper{}) - // WARNING: for serv command, MUST remove the output to os.stdout, // so use log file to instead print to stdout. - logPath := path.Join(setting.LogRootPath, "xorm.log") - - if err := os.MkdirAll(path.Dir(logPath), os.ModePerm); err != nil { - return fmt.Errorf("Failed to create dir %s: %v", logPath, err) - } - - f, err := os.Create(logPath) - if err != nil { - return fmt.Errorf("Failed to create xorm.log: %v", err) - } - x.SetLogger(xorm.NewSimpleLogger(f)) + x.SetLogger(log.XORMLogger) x.ShowSQL(true) return nil } diff --git a/modules/log/xorm.go b/modules/log/xorm.go new file mode 100644 index 0000000000000..1a311b817b1fe --- /dev/null +++ b/modules/log/xorm.go @@ -0,0 +1,113 @@ +package log + +import ( + "fmt" + + "github.com/go-xorm/core" +) + +// XORMLogBridge a logger bridge from Logger to xorm +type XORMLogBridge struct { + logger *Logger + showSQL bool + level core.LogLevel +} + +var ( + // XORMLogger the logger for xorm + XORMLogger *XORMLogBridge +) + +// NewXORMLogger generate logger for xorm FIXME: configable +func NewXORMLogger(bufferlen int64, mode, config string) { + logger := newLogger(bufferlen) + logger.SetLogger(mode, config) + XORMLogger = &XORMLogBridge{ + logger: logger, + showSQL: true, + } +} + +// Debug show debug log +func (l *XORMLogBridge) Debug(v ...interface{}) { + if l.level >= core.LOG_DEBUG { + msg := fmt.Sprint(v...) + l.logger.writerMsg(0, DEBUG, "[D]"+msg) + } +} + +// Debugf show debug log +func (l *XORMLogBridge) Debugf(format string, v ...interface{}) { + if l.level >= core.LOG_DEBUG { + l.logger.Debug(format, v...) + } +} + +// Error show error log +func (l *XORMLogBridge) Error(v ...interface{}) { + if l.level >= core.LOG_ERR { + msg := fmt.Sprint(v...) + l.logger.writerMsg(0, ERROR, "[E]"+msg) + } +} + +// Errorf show error log +func (l *XORMLogBridge) Errorf(format string, v ...interface{}) { + if l.level >= core.LOG_ERR { + l.logger.Error(0, format, v...) + } +} + +// Info show information level log +func (l *XORMLogBridge) Info(v ...interface{}) { + if l.level >= core.LOG_INFO { + msg := fmt.Sprint(v...) + l.logger.writerMsg(0, INFO, "[I]"+msg) + } +} + +// Infof show information level log +func (l *XORMLogBridge) Infof(format string, v ...interface{}) { + if l.level >= core.LOG_INFO { + l.logger.Info(format, v...) + } +} + +// Warn show warnning log +func (l *XORMLogBridge) Warn(v ...interface{}) { + if l.level >= core.LOG_WARNING { + msg := fmt.Sprint(v...) + l.logger.writerMsg(0, WARN, "[W] "+msg) + } +} + +// Warnf show warnning log +func (l *XORMLogBridge) Warnf(format string, v ...interface{}) { + if l.level >= core.LOG_WARNING { + l.logger.Warn(format, v...) + } +} + +// Level get logger level +func (l *XORMLogBridge) Level() core.LogLevel { + return l.level +} + +// SetLevel set logger level +func (l *XORMLogBridge) SetLevel(level core.LogLevel) { + l.level = level +} + +// ShowSQL set if record SQL +func (l *XORMLogBridge) ShowSQL(show ...bool) { + if len(show) > 0 { + l.showSQL = show[0] + } else { + l.showSQL = true + } +} + +// IsShowSQL if record SQL +func (l *XORMLogBridge) IsShowSQL() bool { + return l.showSQL +} diff --git a/modules/setting/setting.go b/modules/setting/setting.go index bbccb44eab0ca..82b73853afbd0 100644 --- a/modules/setting/setting.go +++ b/modules/setting/setting.go @@ -30,6 +30,7 @@ import ( _ "github.com/go-macaron/cache/redis" "github.com/go-macaron/session" _ "github.com/go-macaron/session/redis" // redis plugin for store session + "github.com/go-xorm/core" ini "gopkg.in/ini.v1" "strk.kbt.io/projects/go/libravatar" ) @@ -1014,6 +1015,85 @@ func newLogService() { } } +func NewXORMLogService(disableConsole bool) { + logModes := strings.Split(Cfg.Section("log").Key("MODE").MustString("console"), ",") + var logConfigs string + for _, mode := range logModes { + if disableConsole && mode == "console" { + continue + } + mode = strings.TrimSpace(mode) + sec, err := Cfg.GetSection("log." + mode) + if err != nil { + log.Fatal(4, "Unknown log mode: %s", mode) + } + + validLevels := []string{"Trace", "Debug", "Info", "Warn", "Error", "Critical"} + // Log level. + levelName := Cfg.Section("log."+mode).Key("LEVEL").In( + Cfg.Section("log").Key("LEVEL").In("Trace", validLevels), + validLevels) + level, ok := logLevels[levelName] + if !ok { + log.Fatal(4, "Unknown log level: %s", levelName) + } + + // Generate log configuration. + switch mode { + case "console": + logConfigs = fmt.Sprintf(`{"level":%s}`, level) + case "file": + logPath := sec.Key("FILE_NAME").MustString(path.Join(LogRootPath, "xorm.log")) + if err = os.MkdirAll(path.Dir(logPath), os.ModePerm); err != nil { + panic(err.Error()) + } + logPath = filepath.Join(filepath.Dir(logPath), "xorm.log") + + logConfigs = fmt.Sprintf( + `{"level":%s,"filename":"%s","rotate":%v,"maxlines":%d,"maxsize":%d,"daily":%v,"maxdays":%d}`, level, + logPath, + sec.Key("LOG_ROTATE").MustBool(true), + sec.Key("MAX_LINES").MustInt(1000000), + 1< Date: Wed, 16 Nov 2016 14:43:55 +0800 Subject: [PATCH 2/4] bug fixed for other sub commands except web --- models/models.go | 2 ++ modules/setting/setting.go | 1 + 2 files changed, 3 insertions(+) diff --git a/models/models.go b/models/models.go index 4ec4750fb9128..33268fabbed4a 100644 --- a/models/models.go +++ b/models/models.go @@ -238,6 +238,8 @@ func NewTestEngine(x *xorm.Engine) (err error) { return fmt.Errorf("Connect to database: %v", err) } + setting.NewXORMLogService(false) + x.SetMapper(core.GonicMapper{}) return x.StoreEngine("InnoDB").Sync2(tables...) } diff --git a/modules/setting/setting.go b/modules/setting/setting.go index 82b73853afbd0..a37e56e5962f3 100644 --- a/modules/setting/setting.go +++ b/modules/setting/setting.go @@ -1015,6 +1015,7 @@ func newLogService() { } } +// NewXORMLogService initializes xorm logger service func NewXORMLogService(disableConsole bool) { logModes := strings.Split(Cfg.Section("log").Key("MODE").MustString("console"), ",") var logConfigs string From a7c6d961c17c8a0e4a7834215b0eb16f5f8725ca Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Thu, 26 Jan 2017 22:30:18 +0800 Subject: [PATCH 3/4] rebase and fix xorm log --- modules/log/xorm.go | 59 ++++++++++++++++++++++++++++++--------------- 1 file changed, 39 insertions(+), 20 deletions(-) diff --git a/modules/log/xorm.go b/modules/log/xorm.go index 1a311b817b1fe..83a52d989bb53 100644 --- a/modules/log/xorm.go +++ b/modules/log/xorm.go @@ -8,7 +8,7 @@ import ( // XORMLogBridge a logger bridge from Logger to xorm type XORMLogBridge struct { - logger *Logger + loggers []*Logger showSQL bool level core.LogLevel } @@ -22,69 +22,88 @@ var ( func NewXORMLogger(bufferlen int64, mode, config string) { logger := newLogger(bufferlen) logger.SetLogger(mode, config) - XORMLogger = &XORMLogBridge{ - logger: logger, - showSQL: true, + if XORMLogger == nil { + XORMLogger = &XORMLogBridge{ + showSQL: true, + } } + XORMLogger.loggers = append(XORMLogger.loggers, logger) +} + +func (l *XORMLogBridge) writerMsg(skip, level int, msg string) error { + for _, logger := range l.loggers { + if err := logger.writerMsg(skip, level, msg); err != nil { + return err + } + } + return nil } // Debug show debug log func (l *XORMLogBridge) Debug(v ...interface{}) { - if l.level >= core.LOG_DEBUG { + if l.level <= core.LOG_DEBUG { msg := fmt.Sprint(v...) - l.logger.writerMsg(0, DEBUG, "[D]"+msg) + l.writerMsg(0, DEBUG, "[D]"+msg) } } // Debugf show debug log func (l *XORMLogBridge) Debugf(format string, v ...interface{}) { - if l.level >= core.LOG_DEBUG { - l.logger.Debug(format, v...) + if l.level <= core.LOG_DEBUG { + for _, logger := range l.loggers { + logger.Debug(format, v...) + } } } // Error show error log func (l *XORMLogBridge) Error(v ...interface{}) { - if l.level >= core.LOG_ERR { + if l.level <= core.LOG_ERR { msg := fmt.Sprint(v...) - l.logger.writerMsg(0, ERROR, "[E]"+msg) + l.writerMsg(0, ERROR, "[E]"+msg) } } // Errorf show error log func (l *XORMLogBridge) Errorf(format string, v ...interface{}) { - if l.level >= core.LOG_ERR { - l.logger.Error(0, format, v...) + if l.level <= core.LOG_ERR { + for _, logger := range l.loggers { + logger.Error(0, format, v...) + } } } // Info show information level log func (l *XORMLogBridge) Info(v ...interface{}) { - if l.level >= core.LOG_INFO { + if l.level <= core.LOG_INFO { msg := fmt.Sprint(v...) - l.logger.writerMsg(0, INFO, "[I]"+msg) + l.writerMsg(0, INFO, "[I]"+msg) } } // Infof show information level log func (l *XORMLogBridge) Infof(format string, v ...interface{}) { - if l.level >= core.LOG_INFO { - l.logger.Info(format, v...) + if l.level <= core.LOG_INFO { + for _, logger := range l.loggers { + logger.Info(format, v...) + } } } // Warn show warnning log func (l *XORMLogBridge) Warn(v ...interface{}) { - if l.level >= core.LOG_WARNING { + if l.level <= core.LOG_WARNING { msg := fmt.Sprint(v...) - l.logger.writerMsg(0, WARN, "[W] "+msg) + l.writerMsg(0, WARN, "[W] "+msg) } } // Warnf show warnning log func (l *XORMLogBridge) Warnf(format string, v ...interface{}) { - if l.level >= core.LOG_WARNING { - l.logger.Warn(format, v...) + if l.level <= core.LOG_WARNING { + for _, logger := range l.loggers { + logger.Warn(format, v...) + } } } From 2daebbcf130063d3b924ad8175a878e0c11709c9 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Sun, 19 Feb 2017 11:31:21 +0800 Subject: [PATCH 4/4] bug fix for TrimSpace --- modules/log/xorm.go | 4 ++++ modules/setting/setting.go | 11 ++++++----- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/modules/log/xorm.go b/modules/log/xorm.go index 83a52d989bb53..9b23d9f3700ee 100644 --- a/modules/log/xorm.go +++ b/modules/log/xorm.go @@ -1,3 +1,7 @@ +// Copyright 2017 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + package log import ( diff --git a/modules/setting/setting.go b/modules/setting/setting.go index a37e56e5962f3..e69cfaa320822 100644 --- a/modules/setting/setting.go +++ b/modules/setting/setting.go @@ -945,18 +945,18 @@ func newLogService() { LogConfigs = make([]string, len(LogModes)) useConsole := false - for _, mode := range LogModes { - if mode == "console" { + for i := 0; i < len(LogModes); i++ { + LogModes[i] = strings.TrimSpace(LogModes[i]) + if LogModes[i] == "console" { useConsole = true } } + if !useConsole { log.DelLogger("console") } for i, mode := range LogModes { - mode = strings.TrimSpace(mode) - sec, err := Cfg.GetSection("log." + mode) if err != nil { @@ -1020,10 +1020,11 @@ func NewXORMLogService(disableConsole bool) { logModes := strings.Split(Cfg.Section("log").Key("MODE").MustString("console"), ",") var logConfigs string for _, mode := range logModes { + mode = strings.TrimSpace(mode) + if disableConsole && mode == "console" { continue } - mode = strings.TrimSpace(mode) sec, err := Cfg.GetSection("log." + mode) if err != nil { log.Fatal(4, "Unknown log mode: %s", mode)