Files
nofx/logger/logger.go
T
2025-12-08 01:43:22 +08:00

168 lines
3.7 KiB
Go

package logger
import (
"os"
"github.com/sirupsen/logrus"
)
var (
// Log is the global logger instance
Log *logrus.Logger
)
func init() {
// Auto-initialize default logger to ensure it works before Init is called
Log = logrus.New()
Log.SetLevel(logrus.InfoLevel)
Log.SetFormatter(&logrus.TextFormatter{
FullTimestamp: true,
TimestampFormat: "2006-01-02 15:04:05",
ForceColors: true,
})
Log.SetOutput(os.Stdout)
}
// ============================================================================
// Initialization functions
// ============================================================================
// Init initializes the global logger
// If config is nil, uses default configuration (console output, info level)
func Init(cfg *Config) error {
Log = logrus.New()
// Use default values if no config provided
if cfg == nil {
cfg = &Config{Level: "info"}
}
// Set default values
cfg.SetDefaults()
// Set log level
level, err := logrus.ParseLevel(cfg.Level)
if err != nil {
level = logrus.InfoLevel
}
Log.SetLevel(level)
// Set formatter (always use colored text format)
Log.SetFormatter(&logrus.TextFormatter{
FullTimestamp: true,
TimestampFormat: "2006-01-02 15:04:05",
ForceColors: true,
})
// Set output target (default stdout)
Log.SetOutput(os.Stdout)
// Enable caller location info
Log.SetReportCaller(true)
return nil
}
// InitWithSimpleConfig initializes logger with simplified config
// Suitable for scenarios that only need basic functionality
func InitWithSimpleConfig(level string) error {
return Init(&Config{Level: level})
}
// Shutdown gracefully shuts down the logger
func Shutdown() {
// Reserved for future extensions
}
// ============================================================================
// Logging functions
// ============================================================================
// WithFields creates logger entry with fields
func WithFields(fields logrus.Fields) *logrus.Entry {
return Log.WithFields(fields)
}
// WithField creates logger entry with a single field
func WithField(key string, value interface{}) *logrus.Entry {
return Log.WithField(key, value)
}
// add debug, info, warn
func Debug(args ...interface{}) {
Log.Debug(args...)
}
func Info(args ...interface{}) {
Log.Info(args...)
}
func Warn(args ...interface{}) {
Log.Warn(args...)
}
func Debugf(format string, args ...interface{}) {
Log.Debugf(format, args...)
}
func Infof(format string, args ...interface{}) {
Log.Infof(format, args...)
}
func Warnf(format string, args ...interface{}) {
Log.Warnf(format, args...)
}
func Error(args ...interface{}) {
Log.Error(args...)
}
func Errorf(format string, args ...interface{}) {
Log.Errorf(format, args...)
}
func Fatal(args ...interface{}) {
Log.Fatal(args...)
}
func Fatalf(format string, args ...interface{}) {
Log.Fatalf(format, args...)
}
func Panic(args ...interface{}) {
Log.Panic(args...)
}
func Panicf(format string, args ...interface{}) {
Log.Panicf(format, args...)
}
// ============================================================================
// MCP Logger adapter
// ============================================================================
// MCPLogger adapter that allows MCP package to use the global logger
// Implements mcp.Logger interface
type MCPLogger struct{}
// NewMCPLogger creates MCP log adapter
func NewMCPLogger() *MCPLogger {
return &MCPLogger{}
}
func (l *MCPLogger) Debugf(format string, args ...any) {
Log.Debugf(format, args...)
}
func (l *MCPLogger) Infof(format string, args ...any) {
Log.Infof(format, args...)
}
func (l *MCPLogger) Warnf(format string, args ...any) {
Log.Warnf(format, args...)
}
func (l *MCPLogger) Errorf(format string, args ...any) {
Log.Errorf(format, args...)
}