215 lines
5.0 KiB
Go
215 lines
5.0 KiB
Go
package logging
|
|
|
|
import (
|
|
"fmt"
|
|
"sync"
|
|
)
|
|
|
|
var (
|
|
// Legacy logger for backward compatibility
|
|
logger *Logger
|
|
once sync.Once
|
|
)
|
|
|
|
// Logger maintains backward compatibility with existing code
|
|
type Logger struct {
|
|
base *BaseLogger
|
|
errorLogger *ErrorLogger
|
|
warnLogger *WarnLogger
|
|
infoLogger *InfoLogger
|
|
debugLogger *DebugLogger
|
|
}
|
|
|
|
// Initialize creates or gets the singleton logger instance
|
|
// This maintains backward compatibility with existing code
|
|
func Initialize() (*Logger, error) {
|
|
var err error
|
|
once.Do(func() {
|
|
logger, err = newLogger()
|
|
})
|
|
return logger, err
|
|
}
|
|
|
|
func newLogger() (*Logger, error) {
|
|
// Initialize the base logger
|
|
baseLogger, err := InitializeBase("log")
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// Create the legacy logger wrapper
|
|
logger := &Logger{
|
|
base: baseLogger,
|
|
errorLogger: GetErrorLogger(),
|
|
warnLogger: GetWarnLogger(),
|
|
infoLogger: GetInfoLogger(),
|
|
debugLogger: GetDebugLogger(),
|
|
}
|
|
|
|
return logger, nil
|
|
}
|
|
|
|
// Close closes the logger
|
|
func (l *Logger) Close() error {
|
|
if l.base != nil {
|
|
return l.base.Close()
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// Legacy methods for backward compatibility
|
|
func (l *Logger) log(level, format string, v ...interface{}) {
|
|
if l.base != nil {
|
|
l.base.LogWithCaller(LogLevel(level), 3, format, v...)
|
|
}
|
|
}
|
|
|
|
func (l *Logger) Info(format string, v ...interface{}) {
|
|
if l.infoLogger != nil {
|
|
l.infoLogger.Log(format, v...)
|
|
}
|
|
}
|
|
|
|
func (l *Logger) Error(format string, v ...interface{}) {
|
|
if l.errorLogger != nil {
|
|
l.errorLogger.Log(format, v...)
|
|
}
|
|
}
|
|
|
|
func (l *Logger) Warn(format string, v ...interface{}) {
|
|
if l.warnLogger != nil {
|
|
l.warnLogger.Log(format, v...)
|
|
}
|
|
}
|
|
|
|
func (l *Logger) Debug(format string, v ...interface{}) {
|
|
if l.debugLogger != nil {
|
|
l.debugLogger.Log(format, v...)
|
|
}
|
|
}
|
|
|
|
func (l *Logger) Panic(format string) {
|
|
if l.errorLogger != nil {
|
|
l.errorLogger.LogFatal(format)
|
|
}
|
|
}
|
|
|
|
// Global convenience functions for backward compatibility
|
|
// These are now implemented in individual logger files to avoid redeclaration
|
|
func LegacyInfo(format string, v ...interface{}) {
|
|
if logger != nil {
|
|
logger.Info(format, v...)
|
|
} else {
|
|
// Fallback to direct logger if legacy logger not initialized
|
|
GetInfoLogger().Log(format, v...)
|
|
}
|
|
}
|
|
|
|
func LegacyError(format string, v ...interface{}) {
|
|
if logger != nil {
|
|
logger.Error(format, v...)
|
|
} else {
|
|
// Fallback to direct logger if legacy logger not initialized
|
|
GetErrorLogger().Log(format, v...)
|
|
}
|
|
}
|
|
|
|
func LegacyWarn(format string, v ...interface{}) {
|
|
if logger != nil {
|
|
logger.Warn(format, v...)
|
|
} else {
|
|
// Fallback to direct logger if legacy logger not initialized
|
|
GetWarnLogger().Log(format, v...)
|
|
}
|
|
}
|
|
|
|
func LegacyDebug(format string, v ...interface{}) {
|
|
if logger != nil {
|
|
logger.Debug(format, v...)
|
|
} else {
|
|
// Fallback to direct logger if legacy logger not initialized
|
|
GetDebugLogger().Log(format, v...)
|
|
}
|
|
}
|
|
|
|
func Panic(format string) {
|
|
if logger != nil {
|
|
logger.Panic(format)
|
|
} else {
|
|
// Fallback to direct logger if legacy logger not initialized
|
|
GetErrorLogger().LogFatal(format)
|
|
}
|
|
}
|
|
|
|
// Enhanced logging convenience functions
|
|
// These provide direct access to specialized logging functions
|
|
|
|
// LogStartup logs application startup information
|
|
func LogStartup(component string, message string) {
|
|
GetInfoLogger().LogStartup(component, message)
|
|
}
|
|
|
|
// LogShutdown logs application shutdown information
|
|
func LogShutdown(component string, message string) {
|
|
GetInfoLogger().LogShutdown(component, message)
|
|
}
|
|
|
|
// LogOperation logs general operation information
|
|
func LogOperation(operation string, details string) {
|
|
GetInfoLogger().LogOperation(operation, details)
|
|
}
|
|
|
|
// LogRequest logs incoming HTTP requests
|
|
func LogRequest(method string, path string, userAgent string) {
|
|
GetInfoLogger().LogRequest(method, path, userAgent)
|
|
}
|
|
|
|
// LogResponse logs outgoing HTTP responses
|
|
func LogResponse(method string, path string, statusCode int, duration string) {
|
|
GetInfoLogger().LogResponse(method, path, statusCode, duration)
|
|
}
|
|
|
|
// LogSQL logs SQL queries for debugging
|
|
func LogSQL(query string, args ...interface{}) {
|
|
GetDebugLogger().LogSQL(query, args...)
|
|
}
|
|
|
|
// LogMemory logs memory usage information
|
|
func LogMemory() {
|
|
GetDebugLogger().LogMemory()
|
|
}
|
|
|
|
// LogTiming logs timing information for performance debugging
|
|
func LogTiming(operation string, duration interface{}) {
|
|
GetDebugLogger().LogTiming(operation, duration)
|
|
}
|
|
|
|
// GetLegacyLogger returns the legacy logger instance for backward compatibility
|
|
func GetLegacyLogger() *Logger {
|
|
if logger == nil {
|
|
logger, _ = Initialize()
|
|
}
|
|
return logger
|
|
}
|
|
|
|
// InitializeLogging initializes all logging components
|
|
func InitializeLogging() error {
|
|
// Initialize legacy logger for backward compatibility
|
|
_, err := Initialize()
|
|
if err != nil {
|
|
return fmt.Errorf("failed to initialize legacy logger: %v", err)
|
|
}
|
|
|
|
// Pre-initialize all logger types to ensure separate log files
|
|
GetErrorLogger()
|
|
GetWarnLogger()
|
|
GetInfoLogger()
|
|
GetDebugLogger()
|
|
GetPerformanceLogger()
|
|
|
|
// Log successful initialization
|
|
Info("Logging system initialized successfully")
|
|
|
|
return nil
|
|
}
|