Skip to content

Commit 04fdeb9

Browse files
authored
Make Xorm log configurable (#174)
* make xorm log configable * bug fixed for other sub commands except web * rebase and fix xorm log * bug fix for TrimSpace
1 parent d4b752d commit 04fdeb9

File tree

5 files changed

+231
-17
lines changed

5 files changed

+231
-17
lines changed

cmd/admin.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,8 @@ func runCreateUser(c *cli.Context) error {
7474

7575
setting.NewContext()
7676
models.LoadConfigs()
77+
78+
setting.NewXORMLogService(false)
7779
if err := models.SetEngine(); err != nil {
7880
return fmt.Errorf("models.SetEngine: %v", err)
7981
}

cmd/serve.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,6 @@ var CmdServ = cli.Command{
5050
func setup(logPath string) error {
5151
setting.NewContext()
5252
log.NewGitLogger(filepath.Join(setting.LogRootPath, logPath))
53-
5453
models.LoadConfigs()
5554

5655
if setting.UseSQLite3 || setting.UseTiDB {
@@ -60,6 +59,7 @@ func setup(logPath string) error {
6059
}
6160
}
6261

62+
setting.NewXORMLogService(true)
6363
return models.SetEngine()
6464
}
6565

models/models.go

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import (
2525
_ "github.com/denisenkom/go-mssqldb"
2626

2727
"code.gitea.io/gitea/models/migrations"
28+
"code.gitea.io/gitea/modules/log"
2829
"code.gitea.io/gitea/modules/setting"
2930
)
3031

@@ -226,6 +227,7 @@ func getEngine() (*xorm.Engine, error) {
226227
default:
227228
return nil, fmt.Errorf("Unknown database type: %s", DbCfg.Type)
228229
}
230+
229231
return xorm.NewEngine(DbCfg.Type, connStr)
230232
}
231233

@@ -236,6 +238,8 @@ func NewTestEngine(x *xorm.Engine) (err error) {
236238
return fmt.Errorf("Connect to database: %v", err)
237239
}
238240

241+
setting.NewXORMLogService(false)
242+
239243
x.SetMapper(core.GonicMapper{})
240244
return x.StoreEngine("InnoDB").Sync2(tables...)
241245
}
@@ -248,20 +252,9 @@ func SetEngine() (err error) {
248252
}
249253

250254
x.SetMapper(core.GonicMapper{})
251-
252255
// WARNING: for serv command, MUST remove the output to os.stdout,
253256
// so use log file to instead print to stdout.
254-
logPath := path.Join(setting.LogRootPath, "xorm.log")
255-
256-
if err := os.MkdirAll(path.Dir(logPath), os.ModePerm); err != nil {
257-
return fmt.Errorf("Failed to create dir %s: %v", logPath, err)
258-
}
259-
260-
f, err := os.Create(logPath)
261-
if err != nil {
262-
return fmt.Errorf("Failed to create xorm.log: %v", err)
263-
}
264-
x.SetLogger(xorm.NewSimpleLogger(f))
257+
x.SetLogger(log.XORMLogger)
265258
x.ShowSQL(true)
266259
return nil
267260
}

modules/log/xorm.go

Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
// Copyright 2017 The Gitea Authors. All rights reserved.
2+
// Use of this source code is governed by a MIT-style
3+
// license that can be found in the LICENSE file.
4+
5+
package log
6+
7+
import (
8+
"fmt"
9+
10+
"github.com/go-xorm/core"
11+
)
12+
13+
// XORMLogBridge a logger bridge from Logger to xorm
14+
type XORMLogBridge struct {
15+
loggers []*Logger
16+
showSQL bool
17+
level core.LogLevel
18+
}
19+
20+
var (
21+
// XORMLogger the logger for xorm
22+
XORMLogger *XORMLogBridge
23+
)
24+
25+
// NewXORMLogger generate logger for xorm FIXME: configable
26+
func NewXORMLogger(bufferlen int64, mode, config string) {
27+
logger := newLogger(bufferlen)
28+
logger.SetLogger(mode, config)
29+
if XORMLogger == nil {
30+
XORMLogger = &XORMLogBridge{
31+
showSQL: true,
32+
}
33+
}
34+
XORMLogger.loggers = append(XORMLogger.loggers, logger)
35+
}
36+
37+
func (l *XORMLogBridge) writerMsg(skip, level int, msg string) error {
38+
for _, logger := range l.loggers {
39+
if err := logger.writerMsg(skip, level, msg); err != nil {
40+
return err
41+
}
42+
}
43+
return nil
44+
}
45+
46+
// Debug show debug log
47+
func (l *XORMLogBridge) Debug(v ...interface{}) {
48+
if l.level <= core.LOG_DEBUG {
49+
msg := fmt.Sprint(v...)
50+
l.writerMsg(0, DEBUG, "[D]"+msg)
51+
}
52+
}
53+
54+
// Debugf show debug log
55+
func (l *XORMLogBridge) Debugf(format string, v ...interface{}) {
56+
if l.level <= core.LOG_DEBUG {
57+
for _, logger := range l.loggers {
58+
logger.Debug(format, v...)
59+
}
60+
}
61+
}
62+
63+
// Error show error log
64+
func (l *XORMLogBridge) Error(v ...interface{}) {
65+
if l.level <= core.LOG_ERR {
66+
msg := fmt.Sprint(v...)
67+
l.writerMsg(0, ERROR, "[E]"+msg)
68+
}
69+
}
70+
71+
// Errorf show error log
72+
func (l *XORMLogBridge) Errorf(format string, v ...interface{}) {
73+
if l.level <= core.LOG_ERR {
74+
for _, logger := range l.loggers {
75+
logger.Error(0, format, v...)
76+
}
77+
}
78+
}
79+
80+
// Info show information level log
81+
func (l *XORMLogBridge) Info(v ...interface{}) {
82+
if l.level <= core.LOG_INFO {
83+
msg := fmt.Sprint(v...)
84+
l.writerMsg(0, INFO, "[I]"+msg)
85+
}
86+
}
87+
88+
// Infof show information level log
89+
func (l *XORMLogBridge) Infof(format string, v ...interface{}) {
90+
if l.level <= core.LOG_INFO {
91+
for _, logger := range l.loggers {
92+
logger.Info(format, v...)
93+
}
94+
}
95+
}
96+
97+
// Warn show warnning log
98+
func (l *XORMLogBridge) Warn(v ...interface{}) {
99+
if l.level <= core.LOG_WARNING {
100+
msg := fmt.Sprint(v...)
101+
l.writerMsg(0, WARN, "[W] "+msg)
102+
}
103+
}
104+
105+
// Warnf show warnning log
106+
func (l *XORMLogBridge) Warnf(format string, v ...interface{}) {
107+
if l.level <= core.LOG_WARNING {
108+
for _, logger := range l.loggers {
109+
logger.Warn(format, v...)
110+
}
111+
}
112+
}
113+
114+
// Level get logger level
115+
func (l *XORMLogBridge) Level() core.LogLevel {
116+
return l.level
117+
}
118+
119+
// SetLevel set logger level
120+
func (l *XORMLogBridge) SetLevel(level core.LogLevel) {
121+
l.level = level
122+
}
123+
124+
// ShowSQL set if record SQL
125+
func (l *XORMLogBridge) ShowSQL(show ...bool) {
126+
if len(show) > 0 {
127+
l.showSQL = show[0]
128+
} else {
129+
l.showSQL = true
130+
}
131+
}
132+
133+
// IsShowSQL if record SQL
134+
func (l *XORMLogBridge) IsShowSQL() bool {
135+
return l.showSQL
136+
}

modules/setting/setting.go

Lines changed: 87 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import (
3030
_ "github.com/go-macaron/cache/redis"
3131
"github.com/go-macaron/session"
3232
_ "github.com/go-macaron/session/redis" // redis plugin for store session
33+
"github.com/go-xorm/core"
3334
ini "gopkg.in/ini.v1"
3435
"strk.kbt.io/projects/go/libravatar"
3536
)
@@ -944,18 +945,18 @@ func newLogService() {
944945
LogConfigs = make([]string, len(LogModes))
945946

946947
useConsole := false
947-
for _, mode := range LogModes {
948-
if mode == "console" {
948+
for i := 0; i < len(LogModes); i++ {
949+
LogModes[i] = strings.TrimSpace(LogModes[i])
950+
if LogModes[i] == "console" {
949951
useConsole = true
950952
}
951953
}
954+
952955
if !useConsole {
953956
log.DelLogger("console")
954957
}
955958

956959
for i, mode := range LogModes {
957-
mode = strings.TrimSpace(mode)
958-
959960
sec, err := Cfg.GetSection("log." + mode)
960961

961962
if err != nil {
@@ -1014,6 +1015,87 @@ func newLogService() {
10141015
}
10151016
}
10161017

1018+
// NewXORMLogService initializes xorm logger service
1019+
func NewXORMLogService(disableConsole bool) {
1020+
logModes := strings.Split(Cfg.Section("log").Key("MODE").MustString("console"), ",")
1021+
var logConfigs string
1022+
for _, mode := range logModes {
1023+
mode = strings.TrimSpace(mode)
1024+
1025+
if disableConsole && mode == "console" {
1026+
continue
1027+
}
1028+
sec, err := Cfg.GetSection("log." + mode)
1029+
if err != nil {
1030+
log.Fatal(4, "Unknown log mode: %s", mode)
1031+
}
1032+
1033+
validLevels := []string{"Trace", "Debug", "Info", "Warn", "Error", "Critical"}
1034+
// Log level.
1035+
levelName := Cfg.Section("log."+mode).Key("LEVEL").In(
1036+
Cfg.Section("log").Key("LEVEL").In("Trace", validLevels),
1037+
validLevels)
1038+
level, ok := logLevels[levelName]
1039+
if !ok {
1040+
log.Fatal(4, "Unknown log level: %s", levelName)
1041+
}
1042+
1043+
// Generate log configuration.
1044+
switch mode {
1045+
case "console":
1046+
logConfigs = fmt.Sprintf(`{"level":%s}`, level)
1047+
case "file":
1048+
logPath := sec.Key("FILE_NAME").MustString(path.Join(LogRootPath, "xorm.log"))
1049+
if err = os.MkdirAll(path.Dir(logPath), os.ModePerm); err != nil {
1050+
panic(err.Error())
1051+
}
1052+
logPath = filepath.Join(filepath.Dir(logPath), "xorm.log")
1053+
1054+
logConfigs = fmt.Sprintf(
1055+
`{"level":%s,"filename":"%s","rotate":%v,"maxlines":%d,"maxsize":%d,"daily":%v,"maxdays":%d}`, level,
1056+
logPath,
1057+
sec.Key("LOG_ROTATE").MustBool(true),
1058+
sec.Key("MAX_LINES").MustInt(1000000),
1059+
1<<uint(sec.Key("MAX_SIZE_SHIFT").MustInt(28)),
1060+
sec.Key("DAILY_ROTATE").MustBool(true),
1061+
sec.Key("MAX_DAYS").MustInt(7))
1062+
case "conn":
1063+
logConfigs = fmt.Sprintf(`{"level":%s,"reconnectOnMsg":%v,"reconnect":%v,"net":"%s","addr":"%s"}`, level,
1064+
sec.Key("RECONNECT_ON_MSG").MustBool(),
1065+
sec.Key("RECONNECT").MustBool(),
1066+
sec.Key("PROTOCOL").In("tcp", []string{"tcp", "unix", "udp"}),
1067+
sec.Key("ADDR").MustString(":7020"))
1068+
case "smtp":
1069+
logConfigs = fmt.Sprintf(`{"level":%s,"username":"%s","password":"%s","host":"%s","sendTos":"%s","subject":"%s"}`, level,
1070+
sec.Key("USER").MustString("example@example.com"),
1071+
sec.Key("PASSWD").MustString("******"),
1072+
sec.Key("HOST").MustString("127.0.0.1:25"),
1073+
sec.Key("RECEIVERS").MustString("[]"),
1074+
sec.Key("SUBJECT").MustString("Diagnostic message from serve"))
1075+
case "database":
1076+
logConfigs = fmt.Sprintf(`{"level":%s,"driver":"%s","conn":"%s"}`, level,
1077+
sec.Key("DRIVER").String(),
1078+
sec.Key("CONN").String())
1079+
}
1080+
1081+
log.NewXORMLogger(Cfg.Section("log").Key("BUFFER_LEN").MustInt64(10000), mode, logConfigs)
1082+
log.Info("XORM Log Mode: %s(%s)", strings.Title(mode), levelName)
1083+
1084+
var lvl core.LogLevel
1085+
switch levelName {
1086+
case "Trace", "Debug":
1087+
lvl = core.LOG_DEBUG
1088+
case "Info":
1089+
lvl = core.LOG_INFO
1090+
case "Warn":
1091+
lvl = core.LOG_WARNING
1092+
case "Error", "Critical":
1093+
lvl = core.LOG_ERR
1094+
}
1095+
log.XORMLogger.SetLevel(lvl)
1096+
}
1097+
}
1098+
10171099
func newCacheService() {
10181100
CacheAdapter = Cfg.Section("cache").Key("ADAPTER").In("memory", []string{"memory", "redis", "memcache"})
10191101
switch CacheAdapter {
@@ -1140,6 +1222,7 @@ func newWebhookService() {
11401222
func NewServices() {
11411223
newService()
11421224
newLogService()
1225+
NewXORMLogService(false)
11431226
newCacheService()
11441227
newSessionService()
11451228
newMailService()

0 commit comments

Comments
 (0)