diff options
Diffstat (limited to 'modules/log/logger.go')
-rw-r--r-- | modules/log/logger.go | 163 |
1 files changed, 36 insertions, 127 deletions
diff --git a/modules/log/logger.go b/modules/log/logger.go index 71949e29b8..a833b6ef0f 100644 --- a/modules/log/logger.go +++ b/modules/log/logger.go @@ -1,141 +1,50 @@ -// Copyright 2019 The Gitea Authors. All rights reserved. +// Copyright 2023 The Gitea Authors. All rights reserved. // SPDX-License-Identifier: MIT +// Package log provides logging capabilities for Gitea. +// Concepts: +// +// * Logger: a Logger provides logging functions and dispatches log events to all its writers +// +// * EventWriter: written log Event to a destination (eg: file, console) +// - EventWriterBase: the base struct of a writer, it contains common fields and functions for all writers +// - WriterType: the type name of a writer, eg: console, file +// - WriterName: aka Mode Name in document, the name of a writer instance, it's usually defined by the config file. +// It is called "mode name" because old code use MODE as config key, to keep compatibility, keep this concept. +// +// * WriterMode: the common options for all writers, eg: log level. +// - WriterConsoleOption and others: the specified options for a writer, eg: file path, remote address. +// +// Call graph: +// -> log.Info() +// -> LoggerImpl.Log() +// -> LoggerImpl.SendLogEvent, then the event goes into writer's goroutines +// -> EventWriter.Run() handles the events package log -import "os" - -// Logger is the basic interface for logging -type Logger interface { - LevelLogger - Trace(format string, v ...interface{}) - IsTrace() bool - Debug(format string, v ...interface{}) - IsDebug() bool - Info(format string, v ...interface{}) - IsInfo() bool - Warn(format string, v ...interface{}) - IsWarn() bool - Error(format string, v ...interface{}) - ErrorWithSkip(skip int, format string, v ...interface{}) - IsError() bool - Critical(format string, v ...interface{}) - CriticalWithSkip(skip int, format string, v ...interface{}) - IsCritical() bool - Fatal(format string, v ...interface{}) - FatalWithSkip(skip int, format string, v ...interface{}) - IsFatal() bool -} - -// LevelLogger is the simplest logging interface -type LevelLogger interface { - Flush() - Close() +// BaseLogger provides the basic logging functions +type BaseLogger interface { + Log(skip int, level Level, format string, v ...any) GetLevel() Level - Log(skip int, level Level, format string, v ...interface{}) error } -// SettableLogger is the interface of loggers which have subloggers -type SettableLogger interface { - SetLogger(name, provider, config string) error - DelLogger(name string) (bool, error) -} +// LevelLogger provides level-related logging functions +type LevelLogger interface { + LevelEnabled(level Level) bool -// StacktraceLogger is a logger that can log stacktraces -type StacktraceLogger interface { - GetStacktraceLevel() Level + Trace(format string, v ...any) + Debug(format string, v ...any) + Info(format string, v ...any) + Warn(format string, v ...any) + Error(format string, v ...any) + Critical(format string, v ...any) } -// LevelLoggerLogger wraps a LevelLogger as a Logger -type LevelLoggerLogger struct { +type Logger interface { + BaseLogger LevelLogger } -// Trace records trace log -func (l *LevelLoggerLogger) Trace(format string, v ...interface{}) { - l.Log(1, TRACE, format, v...) //nolint:errcheck -} - -// IsTrace returns true if the logger is TRACE -func (l *LevelLoggerLogger) IsTrace() bool { - return l.GetLevel() <= TRACE -} - -// Debug records debug log -func (l *LevelLoggerLogger) Debug(format string, v ...interface{}) { - l.Log(1, DEBUG, format, v...) //nolint:errcheck -} - -// IsDebug returns true if the logger is DEBUG -func (l *LevelLoggerLogger) IsDebug() bool { - return l.GetLevel() <= DEBUG -} - -// Info records information log -func (l *LevelLoggerLogger) Info(format string, v ...interface{}) { - l.Log(1, INFO, format, v...) //nolint:errcheck -} - -// IsInfo returns true if the logger is INFO -func (l *LevelLoggerLogger) IsInfo() bool { - return l.GetLevel() <= INFO -} - -// Warn records warning log -func (l *LevelLoggerLogger) Warn(format string, v ...interface{}) { - l.Log(1, WARN, format, v...) //nolint:errcheck -} - -// IsWarn returns true if the logger is WARN -func (l *LevelLoggerLogger) IsWarn() bool { - return l.GetLevel() <= WARN -} - -// Error records error log -func (l *LevelLoggerLogger) Error(format string, v ...interface{}) { - l.Log(1, ERROR, format, v...) //nolint:errcheck -} - -// ErrorWithSkip records error log from "skip" calls back from this function -func (l *LevelLoggerLogger) ErrorWithSkip(skip int, format string, v ...interface{}) { - l.Log(skip+1, ERROR, format, v...) //nolint:errcheck -} - -// IsError returns true if the logger is ERROR -func (l *LevelLoggerLogger) IsError() bool { - return l.GetLevel() <= ERROR -} - -// Critical records critical log -func (l *LevelLoggerLogger) Critical(format string, v ...interface{}) { - l.Log(1, CRITICAL, format, v...) //nolint:errcheck -} - -// CriticalWithSkip records critical log from "skip" calls back from this function -func (l *LevelLoggerLogger) CriticalWithSkip(skip int, format string, v ...interface{}) { - l.Log(skip+1, CRITICAL, format, v...) //nolint:errcheck -} - -// IsCritical returns true if the logger is CRITICAL -func (l *LevelLoggerLogger) IsCritical() bool { - return l.GetLevel() <= CRITICAL -} - -// Fatal records fatal log and exit the process -func (l *LevelLoggerLogger) Fatal(format string, v ...interface{}) { - l.Log(1, FATAL, format, v...) //nolint:errcheck - l.Close() - os.Exit(1) -} - -// FatalWithSkip records fatal log from "skip" calls back from this function and exits the process -func (l *LevelLoggerLogger) FatalWithSkip(skip int, format string, v ...interface{}) { - l.Log(skip+1, FATAL, format, v...) //nolint:errcheck - l.Close() - os.Exit(1) -} - -// IsFatal returns true if the logger is FATAL -func (l *LevelLoggerLogger) IsFatal() bool { - return l.GetLevel() <= FATAL +type LogStringer interface { //nolint:revive + LogString() string } |