mattermost-community-enterp.../vendor/github.com/splitio/go-toolkit/v5/logging/logging.go
Claude ec1f89217a Merge: Complete Mattermost Server with Community Enterprise
Full Mattermost server source with integrated Community Enterprise features.
Includes vendor directory for offline/air-gapped builds.

Structure:
- enterprise-impl/: Enterprise feature implementations
- enterprise-community/: Init files that register implementations
- enterprise/: Bridge imports (community_imports.go)
- vendor/: All dependencies for offline builds

Build (online):
  go build ./cmd/mattermost

Build (offline/air-gapped):
  go build -mod=vendor ./cmd/mattermost

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-17 23:59:07 +09:00

151 lines
4.1 KiB
Go

// Package logging ...
// Handles logging within the SDK
package logging
import (
"fmt"
"io"
"log"
"os"
)
const (
skipStackFrameBase = 3 // How many stack frames to skip when logging filename
)
// LoggerOptions ...
// Struct that must be passed to the NewLogger constructor to setup a logger
// CommonWriter and ErrorWriter can be <nil>. In that case they'll default to os.Stdout
type LoggerOptions struct {
LogLevel int
ErrorWriter io.Writer
WarningWriter io.Writer
InfoWriter io.Writer
DebugWriter io.Writer
VerboseWriter io.Writer
StandardLoggerFlags int
Prefix string
ExtraFramesToSkip int
}
// Logger struct. Encapsulates four different loggers, each for a different "level",
// and provides Error, Debug, Warning and Info functions, that will forward a message
// to the appropriate logger.
type Logger struct {
debugLogger log.Logger
infoLogger log.Logger
warningLogger log.Logger
errorLogger log.Logger
verboseLogger log.Logger
framesToSkip int
}
// Verbose logs a message with Debug level
func (l *Logger) Verbose(msg ...interface{}) {
l.verboseLogger.Output(l.framesToSkip, fmt.Sprintln(msg...))
}
// Debug logs a message with Debug level
func (l *Logger) Debug(msg ...interface{}) {
l.debugLogger.Output(l.framesToSkip, fmt.Sprintln(msg...))
}
// Info logs a message with Info level
func (l *Logger) Info(msg ...interface{}) {
l.infoLogger.Output(l.framesToSkip, fmt.Sprintln(msg...))
}
// Warning logs a message with Warning level
func (l *Logger) Warning(msg ...interface{}) {
l.warningLogger.Output(l.framesToSkip, fmt.Sprintln(msg...))
}
// Error logs a message with Error level
func (l *Logger) Error(msg ...interface{}) {
l.errorLogger.Output(l.framesToSkip, fmt.Sprintln(msg...))
}
func normalizeOptions(options *LoggerOptions) *LoggerOptions {
var toRet *LoggerOptions
if options == nil {
toRet = &LoggerOptions{}
} else {
toRet = options
}
if toRet.DebugWriter == nil {
toRet.DebugWriter = os.Stdout
}
if toRet.ErrorWriter == nil {
toRet.ErrorWriter = os.Stdout
}
if toRet.InfoWriter == nil {
toRet.InfoWriter = os.Stdout
}
if toRet.VerboseWriter == nil {
toRet.VerboseWriter = os.Stdout
}
if toRet.WarningWriter == nil {
toRet.WarningWriter = os.Stdout
}
if toRet.StandardLoggerFlags == 0 {
toRet.StandardLoggerFlags = log.Ldate | log.Ltime
}
switch toRet.LogLevel {
case LevelAll, LevelDebug, LevelError, LevelInfo, LevelNone, LevelVerbose, LevelWarning:
default:
toRet.LogLevel = LevelError
}
return toRet
}
// newLogger constructor of Logger instance.
// Returns: a pointer to *Logger
// Assumes: that options are alredy normalized
func newLogger(options *LoggerOptions) *Logger {
prefix := ""
if options.Prefix != "" {
prefix = fmt.Sprintf("%s - ", options.Prefix)
}
return &Logger{
debugLogger: *log.New(options.DebugWriter, fmt.Sprintf("%sDEBUG - ", prefix), options.StandardLoggerFlags),
infoLogger: *log.New(options.InfoWriter, fmt.Sprintf("%sINFO - ", prefix), options.StandardLoggerFlags),
warningLogger: *log.New(options.WarningWriter, fmt.Sprintf("%sWARNING - ", prefix), options.StandardLoggerFlags),
errorLogger: *log.New(options.ErrorWriter, fmt.Sprintf("%sERROR - ", prefix), options.StandardLoggerFlags),
verboseLogger: *log.New(options.VerboseWriter, fmt.Sprintf("%sVERBOSE - ", prefix), options.StandardLoggerFlags),
framesToSkip: 3 + options.ExtraFramesToSkip,
}
}
// NewLogger instantiates a new Logger instance. Requires a pointer to a LoggerOptions struct to be passed.
func NewLogger(options *LoggerOptions) LoggerInterface {
options = normalizeOptions(options)
logger := newLogger(options)
return &LevelFilteredLoggerWrapper{
delegate: logger,
level: options.LogLevel,
}
}
// NewExtendedLogger instantiates a new Logger instance. Requires a pointer to a LoggerOptions struct to be passed.
func NewExtendedLogger(options *LoggerOptions) ExtendedLoggerInterface {
options = normalizeOptions(options)
logger := newLogger(options)
return &ExtendedLevelFilteredLoggerWrapper{&LevelFilteredLoggerWrapper{
delegate: logger,
level: options.LogLevel,
}}
}