summaryrefslogtreecommitdiffstats
path: root/modules/log/multichannel.go
diff options
context:
space:
mode:
authorzeripath <art27@cantab.net>2020-10-31 05:36:46 +0000
committerGitHub <noreply@github.com>2020-10-31 01:36:46 -0400
commit47dd1cb7ae8591b4c63b68371cc1922c0aa5f98e (patch)
tree11b9670fc2655642b7b82873ca8b5a48a5e607ff /modules/log/multichannel.go
parentffc8ce7baef0715bdc2d04cfc1e18379426a1e89 (diff)
downloadgitea-47dd1cb7ae8591b4c63b68371cc1922c0aa5f98e.tar.gz
gitea-47dd1cb7ae8591b4c63b68371cc1922c0aa5f98e.zip
Refactor Logger (#13294)
Refactor Logger to make a logger interface and make it possible to wrap loggers for specific purposes. Co-authored-by: techknowlogick <techknowlogick@gitea.io>
Diffstat (limited to 'modules/log/multichannel.go')
-rw-r--r--modules/log/multichannel.go98
1 files changed, 98 insertions, 0 deletions
diff --git a/modules/log/multichannel.go b/modules/log/multichannel.go
new file mode 100644
index 0000000000..d28071c3f7
--- /dev/null
+++ b/modules/log/multichannel.go
@@ -0,0 +1,98 @@
+// Copyright 2020 The Gogs 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 (
+ "fmt"
+ "runtime"
+ "strings"
+ "time"
+)
+
+// MultiChannelledLogger is default logger in the Gitea application.
+// it can contain several providers and log message into all providers.
+type MultiChannelledLogger struct {
+ LevelLoggerLogger
+ *MultiChannelledLog
+ bufferLength int64
+}
+
+// newLogger initializes and returns a new logger.
+func newLogger(name string, buffer int64) *MultiChannelledLogger {
+ l := &MultiChannelledLogger{
+ MultiChannelledLog: NewMultiChannelledLog(name, buffer),
+ bufferLength: buffer,
+ }
+ l.LevelLogger = l
+ return l
+}
+
+// SetLogger sets new logger instance with given logger provider and config.
+func (l *MultiChannelledLogger) SetLogger(name, provider, config string) error {
+ eventLogger, err := NewChannelledLog(name, provider, config, l.bufferLength)
+ if err != nil {
+ return fmt.Errorf("Failed to create sublogger (%s): %v", name, err)
+ }
+
+ l.MultiChannelledLog.DelLogger(name)
+
+ err = l.MultiChannelledLog.AddLogger(eventLogger)
+ if err != nil {
+ if IsErrDuplicateName(err) {
+ return fmt.Errorf("Duplicate named sublogger %s %v", name, l.MultiChannelledLog.GetEventLoggerNames())
+ }
+ return fmt.Errorf("Failed to add sublogger (%s): %v", name, err)
+ }
+
+ return nil
+}
+
+// DelLogger deletes a sublogger from this logger.
+func (l *MultiChannelledLogger) DelLogger(name string) (bool, error) {
+ return l.MultiChannelledLog.DelLogger(name), nil
+}
+
+// Log msg at the provided level with the provided caller defined by skip (0 being the function that calls this function)
+func (l *MultiChannelledLogger) Log(skip int, level Level, format string, v ...interface{}) error {
+ if l.GetLevel() > level {
+ return nil
+ }
+ caller := "?()"
+ pc, filename, line, ok := runtime.Caller(skip + 1)
+ if ok {
+ // Get caller function name.
+ fn := runtime.FuncForPC(pc)
+ if fn != nil {
+ caller = fn.Name() + "()"
+ }
+ }
+ msg := format
+ if len(v) > 0 {
+ msg = ColorSprintf(format, v...)
+ }
+ stack := ""
+ if l.GetStacktraceLevel() <= level {
+ stack = Stack(skip + 1)
+ }
+ return l.SendLog(level, caller, strings.TrimPrefix(filename, prefix), line, msg, stack)
+}
+
+// SendLog sends a log event at the provided level with the information given
+func (l *MultiChannelledLogger) SendLog(level Level, caller, filename string, line int, msg string, stack string) error {
+ if l.GetLevel() > level {
+ return nil
+ }
+ event := &Event{
+ level: level,
+ caller: caller,
+ filename: filename,
+ line: line,
+ msg: msg,
+ time: time.Now(),
+ stacktrace: stack,
+ }
+ l.LogEvent(event)
+ return nil
+}