mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-11-04 00:28:30 +00:00 
			
		
		
		
	Log to different adapter according to level
This commit is contained in:
		@@ -143,9 +143,9 @@ HOST =
 | 
				
			|||||||
PROVIDER = file
 | 
					PROVIDER = file
 | 
				
			||||||
; Provider config options
 | 
					; Provider config options
 | 
				
			||||||
; memory: not have any config yet
 | 
					; memory: not have any config yet
 | 
				
			||||||
; file: session file path, e.g. data/sessions
 | 
					; file: session file path, e.g. "data/sessions"
 | 
				
			||||||
; redis: config like redis server addr, poolSize, password, e.g. 127.0.0.1:6379,100,astaxie
 | 
					; redis: config like redis server addr, poolSize, password, e.g. "127.0.0.1:6379,100,astaxie"
 | 
				
			||||||
; mysql: go-sql-driver/mysql dsn config string, e.g. root:password@/session_table
 | 
					; mysql: go-sql-driver/mysql dsn config string, e.g. "root:password@/session_table"
 | 
				
			||||||
PROVIDER_CONFIG = data/sessions
 | 
					PROVIDER_CONFIG = data/sessions
 | 
				
			||||||
; Session cookie name
 | 
					; Session cookie name
 | 
				
			||||||
COOKIE_NAME = i_like_gogits
 | 
					COOKIE_NAME = i_like_gogits
 | 
				
			||||||
@@ -169,6 +169,7 @@ DISABLE_GRAVATAR = false
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
[log]
 | 
					[log]
 | 
				
			||||||
; Either "console", "file", "conn", "smtp" or "database", default is "console"
 | 
					; Either "console", "file", "conn", "smtp" or "database", default is "console"
 | 
				
			||||||
 | 
					; Use comma to separate multiple modes, e.g. "console, file"
 | 
				
			||||||
MODE = console
 | 
					MODE = console
 | 
				
			||||||
; Buffer length of channel, keep it as it is if you don't know what it is.
 | 
					; Buffer length of channel, keep it as it is if you don't know what it is.
 | 
				
			||||||
BUFFER_LEN = 10000
 | 
					BUFFER_LEN = 10000
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -70,8 +70,8 @@ var (
 | 
				
			|||||||
	MailService  *Mailer
 | 
						MailService  *Mailer
 | 
				
			||||||
	OauthService *Oauther
 | 
						OauthService *Oauther
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	LogMode   string
 | 
						LogModes   []string
 | 
				
			||||||
	LogConfig string
 | 
						LogConfigs []string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Cache        cache.Cache
 | 
						Cache        cache.Cache
 | 
				
			||||||
	CacheAdapter string
 | 
						CacheAdapter string
 | 
				
			||||||
@@ -130,57 +130,62 @@ func newService() {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func newLogService() {
 | 
					func newLogService() {
 | 
				
			||||||
	// Get and check log mode.
 | 
					 | 
				
			||||||
	LogMode = Cfg.MustValue("log", "MODE", "console")
 | 
					 | 
				
			||||||
	modeSec := "log." + LogMode
 | 
					 | 
				
			||||||
	if _, err := Cfg.GetSection(modeSec); err != nil {
 | 
					 | 
				
			||||||
		qlog.Fatalf("Unknown log mode: %s\n", LogMode)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Log level.
 | 
					 | 
				
			||||||
	levelName := Cfg.MustValue("log."+LogMode, "LEVEL", "Trace")
 | 
					 | 
				
			||||||
	level, ok := logLevels[levelName]
 | 
					 | 
				
			||||||
	if !ok {
 | 
					 | 
				
			||||||
		qlog.Fatalf("Unknown log level: %s\n", levelName)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Generate log configuration.
 | 
					 | 
				
			||||||
	switch LogMode {
 | 
					 | 
				
			||||||
	case "console":
 | 
					 | 
				
			||||||
		LogConfig = fmt.Sprintf(`{"level":%s}`, level)
 | 
					 | 
				
			||||||
	case "file":
 | 
					 | 
				
			||||||
		logPath := Cfg.MustValue(modeSec, "FILE_NAME", "log/gogs.log")
 | 
					 | 
				
			||||||
		os.MkdirAll(path.Dir(logPath), os.ModePerm)
 | 
					 | 
				
			||||||
		LogConfig = fmt.Sprintf(
 | 
					 | 
				
			||||||
			`{"level":%s,"filename":"%s","rotate":%v,"maxlines":%d,"maxsize":%d,"daily":%v,"maxdays":%d}`, level,
 | 
					 | 
				
			||||||
			logPath,
 | 
					 | 
				
			||||||
			Cfg.MustBool(modeSec, "LOG_ROTATE", true),
 | 
					 | 
				
			||||||
			Cfg.MustInt(modeSec, "MAX_LINES", 1000000),
 | 
					 | 
				
			||||||
			1<<uint(Cfg.MustInt(modeSec, "MAX_SIZE_SHIFT", 28)),
 | 
					 | 
				
			||||||
			Cfg.MustBool(modeSec, "DAILY_ROTATE", true),
 | 
					 | 
				
			||||||
			Cfg.MustInt(modeSec, "MAX_DAYS", 7))
 | 
					 | 
				
			||||||
	case "conn":
 | 
					 | 
				
			||||||
		LogConfig = fmt.Sprintf(`{"level":"%s","reconnectOnMsg":%v,"reconnect":%v,"net":"%s","addr":"%s"}`, level,
 | 
					 | 
				
			||||||
			Cfg.MustBool(modeSec, "RECONNECT_ON_MSG", false),
 | 
					 | 
				
			||||||
			Cfg.MustBool(modeSec, "RECONNECT", false),
 | 
					 | 
				
			||||||
			Cfg.MustValue(modeSec, "PROTOCOL", "tcp"),
 | 
					 | 
				
			||||||
			Cfg.MustValue(modeSec, "ADDR", ":7020"))
 | 
					 | 
				
			||||||
	case "smtp":
 | 
					 | 
				
			||||||
		LogConfig = fmt.Sprintf(`{"level":"%s","username":"%s","password":"%s","host":"%s","sendTos":"%s","subject":"%s"}`, level,
 | 
					 | 
				
			||||||
			Cfg.MustValue(modeSec, "USER", "example@example.com"),
 | 
					 | 
				
			||||||
			Cfg.MustValue(modeSec, "PASSWD", "******"),
 | 
					 | 
				
			||||||
			Cfg.MustValue(modeSec, "HOST", "127.0.0.1:25"),
 | 
					 | 
				
			||||||
			Cfg.MustValue(modeSec, "RECEIVERS", "[]"),
 | 
					 | 
				
			||||||
			Cfg.MustValue(modeSec, "SUBJECT", "Diagnostic message from serve"))
 | 
					 | 
				
			||||||
	case "database":
 | 
					 | 
				
			||||||
		LogConfig = fmt.Sprintf(`{"level":"%s","driver":"%s","conn":"%s"}`, level,
 | 
					 | 
				
			||||||
			Cfg.MustValue(modeSec, "Driver"),
 | 
					 | 
				
			||||||
			Cfg.MustValue(modeSec, "CONN"))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	log.Info("%s %s", AppName, AppVer)
 | 
						log.Info("%s %s", AppName, AppVer)
 | 
				
			||||||
	log.NewLogger(Cfg.MustInt64("log", "BUFFER_LEN", 10000), LogMode, LogConfig)
 | 
					
 | 
				
			||||||
	log.Info("Log Mode: %s(%s)", strings.Title(LogMode), levelName)
 | 
						// Get and check log mode.
 | 
				
			||||||
 | 
						LogModes = strings.Split(Cfg.MustValue("log", "MODE", "console"), ",")
 | 
				
			||||||
 | 
						LogConfigs = make([]string, len(LogModes))
 | 
				
			||||||
 | 
						for i, mode := range LogModes {
 | 
				
			||||||
 | 
							mode = strings.TrimSpace(mode)
 | 
				
			||||||
 | 
							modeSec := "log." + mode
 | 
				
			||||||
 | 
							if _, err := Cfg.GetSection(modeSec); err != nil {
 | 
				
			||||||
 | 
								qlog.Fatalf("Unknown log mode: %s\n", mode)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// Log level.
 | 
				
			||||||
 | 
							levelName := Cfg.MustValue("log."+mode, "LEVEL", "Trace")
 | 
				
			||||||
 | 
							level, ok := logLevels[levelName]
 | 
				
			||||||
 | 
							if !ok {
 | 
				
			||||||
 | 
								qlog.Fatalf("Unknown log level: %s\n", levelName)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// Generate log configuration.
 | 
				
			||||||
 | 
							switch mode {
 | 
				
			||||||
 | 
							case "console":
 | 
				
			||||||
 | 
								LogConfigs[i] = fmt.Sprintf(`{"level":%s}`, level)
 | 
				
			||||||
 | 
							case "file":
 | 
				
			||||||
 | 
								logPath := Cfg.MustValue(modeSec, "FILE_NAME", "log/gogs.log")
 | 
				
			||||||
 | 
								os.MkdirAll(path.Dir(logPath), os.ModePerm)
 | 
				
			||||||
 | 
								LogConfigs[i] = fmt.Sprintf(
 | 
				
			||||||
 | 
									`{"level":%s,"filename":"%s","rotate":%v,"maxlines":%d,"maxsize":%d,"daily":%v,"maxdays":%d}`, level,
 | 
				
			||||||
 | 
									logPath,
 | 
				
			||||||
 | 
									Cfg.MustBool(modeSec, "LOG_ROTATE", true),
 | 
				
			||||||
 | 
									Cfg.MustInt(modeSec, "MAX_LINES", 1000000),
 | 
				
			||||||
 | 
									1<<uint(Cfg.MustInt(modeSec, "MAX_SIZE_SHIFT", 28)),
 | 
				
			||||||
 | 
									Cfg.MustBool(modeSec, "DAILY_ROTATE", true),
 | 
				
			||||||
 | 
									Cfg.MustInt(modeSec, "MAX_DAYS", 7))
 | 
				
			||||||
 | 
							case "conn":
 | 
				
			||||||
 | 
								LogConfigs[i] = fmt.Sprintf(`{"level":"%s","reconnectOnMsg":%v,"reconnect":%v,"net":"%s","addr":"%s"}`, level,
 | 
				
			||||||
 | 
									Cfg.MustBool(modeSec, "RECONNECT_ON_MSG", false),
 | 
				
			||||||
 | 
									Cfg.MustBool(modeSec, "RECONNECT", false),
 | 
				
			||||||
 | 
									Cfg.MustValue(modeSec, "PROTOCOL", "tcp"),
 | 
				
			||||||
 | 
									Cfg.MustValue(modeSec, "ADDR", ":7020"))
 | 
				
			||||||
 | 
							case "smtp":
 | 
				
			||||||
 | 
								LogConfigs[i] = fmt.Sprintf(`{"level":"%s","username":"%s","password":"%s","host":"%s","sendTos":"%s","subject":"%s"}`, level,
 | 
				
			||||||
 | 
									Cfg.MustValue(modeSec, "USER", "example@example.com"),
 | 
				
			||||||
 | 
									Cfg.MustValue(modeSec, "PASSWD", "******"),
 | 
				
			||||||
 | 
									Cfg.MustValue(modeSec, "HOST", "127.0.0.1:25"),
 | 
				
			||||||
 | 
									Cfg.MustValue(modeSec, "RECEIVERS", "[]"),
 | 
				
			||||||
 | 
									Cfg.MustValue(modeSec, "SUBJECT", "Diagnostic message from serve"))
 | 
				
			||||||
 | 
							case "database":
 | 
				
			||||||
 | 
								LogConfigs[i] = fmt.Sprintf(`{"level":"%s","driver":"%s","conn":"%s"}`, level,
 | 
				
			||||||
 | 
									Cfg.MustValue(modeSec, "Driver"),
 | 
				
			||||||
 | 
									Cfg.MustValue(modeSec, "CONN"))
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							log.NewLogger(Cfg.MustInt64("log", "BUFFER_LEN", 10000), mode, LogConfigs[i])
 | 
				
			||||||
 | 
							log.Info("Log Mode: %s(%s)", strings.Title(mode), levelName)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func newLdapService() {
 | 
					func newLdapService() {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -10,8 +10,7 @@ import (
 | 
				
			|||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var (
 | 
					var (
 | 
				
			||||||
	logger       *logs.BeeLogger
 | 
						loggers []*logs.BeeLogger
 | 
				
			||||||
	Mode, Config string
 | 
					 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func init() {
 | 
					func init() {
 | 
				
			||||||
@@ -19,32 +18,54 @@ func init() {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func NewLogger(bufLen int64, mode, config string) {
 | 
					func NewLogger(bufLen int64, mode, config string) {
 | 
				
			||||||
	Mode, Config = mode, config
 | 
						logger := logs.NewLogger(bufLen)
 | 
				
			||||||
	logger = logs.NewLogger(bufLen)
 | 
					
 | 
				
			||||||
 | 
						isExist := false
 | 
				
			||||||
 | 
						for _, l := range loggers {
 | 
				
			||||||
 | 
							if l.Adapter == mode {
 | 
				
			||||||
 | 
								isExist = true
 | 
				
			||||||
 | 
								l = logger
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if !isExist {
 | 
				
			||||||
 | 
							loggers = append(loggers, logger)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	logger.SetLogFuncCallDepth(3)
 | 
						logger.SetLogFuncCallDepth(3)
 | 
				
			||||||
	logger.SetLogger(mode, config)
 | 
						logger.SetLogger(mode, config)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func Trace(format string, v ...interface{}) {
 | 
					func Trace(format string, v ...interface{}) {
 | 
				
			||||||
	logger.Trace(format, v...)
 | 
						for _, logger := range loggers {
 | 
				
			||||||
 | 
							logger.Trace(format, v...)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func Debug(format string, v ...interface{}) {
 | 
					func Debug(format string, v ...interface{}) {
 | 
				
			||||||
	logger.Debug(format, v...)
 | 
						for _, logger := range loggers {
 | 
				
			||||||
 | 
							logger.Debug(format, v...)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func Info(format string, v ...interface{}) {
 | 
					func Info(format string, v ...interface{}) {
 | 
				
			||||||
	logger.Info(format, v...)
 | 
						for _, logger := range loggers {
 | 
				
			||||||
 | 
							logger.Info(format, v...)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func Error(format string, v ...interface{}) {
 | 
					func Error(format string, v ...interface{}) {
 | 
				
			||||||
	logger.Error(format, v...)
 | 
						for _, logger := range loggers {
 | 
				
			||||||
 | 
							logger.Error(format, v...)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func Warn(format string, v ...interface{}) {
 | 
					func Warn(format string, v ...interface{}) {
 | 
				
			||||||
	logger.Warn(format, v...)
 | 
						for _, logger := range loggers {
 | 
				
			||||||
 | 
							logger.Warn(format, v...)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func Critical(format string, v ...interface{}) {
 | 
					func Critical(format string, v ...interface{}) {
 | 
				
			||||||
	logger.Critical(format, v...)
 | 
						for _, logger := range loggers {
 | 
				
			||||||
 | 
							logger.Critical(format, v...)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -211,8 +211,14 @@ func Config(ctx *middleware.Context) {
 | 
				
			|||||||
	ctx.Data["PictureService"] = base.PictureService
 | 
						ctx.Data["PictureService"] = base.PictureService
 | 
				
			||||||
	ctx.Data["DisableGravatar"] = base.DisableGravatar
 | 
						ctx.Data["DisableGravatar"] = base.DisableGravatar
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ctx.Data["LogMode"] = base.LogMode
 | 
						type logger struct {
 | 
				
			||||||
	ctx.Data["LogConfig"] = base.LogConfig
 | 
							Mode, Config string
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						loggers := make([]*logger, len(base.LogModes))
 | 
				
			||||||
 | 
						for i := range base.LogModes {
 | 
				
			||||||
 | 
							loggers[i] = &logger{base.LogModes[i], base.LogConfigs[i]}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						ctx.Data["Loggers"] = loggers
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ctx.HTML(200, "admin/config")
 | 
						ctx.HTML(200, "admin/config")
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -194,12 +194,14 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            <div class="panel-body">
 | 
					            <div class="panel-body">
 | 
				
			||||||
                <dl class="dl-horizontal admin-dl-horizontal">
 | 
					                <dl class="dl-horizontal admin-dl-horizontal">
 | 
				
			||||||
 | 
					                    {{range .Loggers}}
 | 
				
			||||||
                    <dt>Log Mode</dt>
 | 
					                    <dt>Log Mode</dt>
 | 
				
			||||||
                    <dd>{{.LogMode}}</dd>
 | 
					                    <dd>{{.Mode}}</dd>
 | 
				
			||||||
                    <dt>Log Config</dt>
 | 
					                    <dt>Log Config</dt>
 | 
				
			||||||
                    <dd>
 | 
					                    <dd>
 | 
				
			||||||
                        <div style="padding-top: 5px;"><pre>{{.LogConfig}}</pre></div>
 | 
					                        <div style="padding-top: 5px;"><pre>{{.Config}}</pre></div>
 | 
				
			||||||
                    </dd>
 | 
					                    </dd>
 | 
				
			||||||
 | 
					                    {{end}}
 | 
				
			||||||
                </dl>
 | 
					                </dl>
 | 
				
			||||||
                
 | 
					                
 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user