mirror of
https://github.com/steveiliop56/tinyauth.git
synced 2026-01-16 12:22:30 +00:00
* Refactor logging to use centralized logger utility - Removed direct usage of zerolog in multiple files and replaced it with a centralized logging utility in the `utils` package. - Introduced `Loggers` struct to manage different loggers (Audit, HTTP, App) with configurable levels and outputs. - Updated all relevant files to utilize the new logging structure, ensuring consistent logging practices across the application. - Enhanced error handling and logging messages for better traceability and debugging. * refactor: update logging implementation to use new logger structure * Refactor logging to use tlog package - Replaced instances of utils logging with tlog in various controllers, services, and middleware. - Introduced audit logging for login success, login failure, and logout events. - Created tlog package with structured logging capabilities using zerolog. - Added tests for the new tlog logger functionality. * refactor: update logging configuration in environment files * fix: adding coderabbit suggestions * fix: ensure correct audit caller * fix: include reason in audit login failure logs
87 lines
1.9 KiB
Go
87 lines
1.9 KiB
Go
package tlog
|
|
|
|
import (
|
|
"os"
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/rs/zerolog"
|
|
"github.com/rs/zerolog/log"
|
|
"github.com/steveiliop56/tinyauth/internal/config"
|
|
)
|
|
|
|
type Logger struct {
|
|
Audit zerolog.Logger
|
|
HTTP zerolog.Logger
|
|
App zerolog.Logger
|
|
}
|
|
|
|
var (
|
|
Audit zerolog.Logger
|
|
HTTP zerolog.Logger
|
|
App zerolog.Logger
|
|
)
|
|
|
|
func NewLogger(cfg config.LogConfig) *Logger {
|
|
baseLogger := log.With().
|
|
Timestamp().
|
|
Caller().
|
|
Logger().
|
|
Level(parseLogLevel(cfg.Level))
|
|
|
|
if !cfg.Json {
|
|
baseLogger = baseLogger.Output(zerolog.ConsoleWriter{
|
|
Out: os.Stderr,
|
|
TimeFormat: time.RFC3339,
|
|
})
|
|
}
|
|
|
|
return &Logger{
|
|
Audit: createLogger("audit", cfg.Streams.Audit, baseLogger),
|
|
HTTP: createLogger("http", cfg.Streams.HTTP, baseLogger),
|
|
App: createLogger("app", cfg.Streams.App, baseLogger),
|
|
}
|
|
}
|
|
|
|
func NewSimpleLogger() *Logger {
|
|
return NewLogger(config.LogConfig{
|
|
Level: "info",
|
|
Json: false,
|
|
Streams: config.LogStreams{
|
|
HTTP: config.LogStreamConfig{Enabled: true},
|
|
App: config.LogStreamConfig{Enabled: true},
|
|
Audit: config.LogStreamConfig{Enabled: false},
|
|
},
|
|
})
|
|
}
|
|
|
|
func (l *Logger) Init() {
|
|
Audit = l.Audit
|
|
HTTP = l.HTTP
|
|
App = l.App
|
|
}
|
|
|
|
func createLogger(component string, streamCfg config.LogStreamConfig, baseLogger zerolog.Logger) zerolog.Logger {
|
|
if !streamCfg.Enabled {
|
|
return zerolog.Nop()
|
|
}
|
|
subLogger := baseLogger.With().Str("log_stream", component).Logger()
|
|
// override level if specified, otherwise use base level
|
|
if streamCfg.Level != "" {
|
|
subLogger = subLogger.Level(parseLogLevel(streamCfg.Level))
|
|
}
|
|
return subLogger
|
|
}
|
|
|
|
func parseLogLevel(level string) zerolog.Level {
|
|
if level == "" {
|
|
return zerolog.InfoLevel
|
|
}
|
|
parsedLevel, err := zerolog.ParseLevel(strings.ToLower(level))
|
|
if err != nil {
|
|
log.Warn().Err(err).Str("level", level).Msg("Invalid log level, defaulting to info")
|
|
parsedLevel = zerolog.InfoLevel
|
|
}
|
|
return parsedLevel
|
|
}
|