1
1
mirror of https://github.com/cooperspencer/gickup synced 2025-04-21 00:07:54 +02:00
gickup/logger/logger.go
2025-01-05 08:52:11 +01:00

85 lines
1.7 KiB
Go

package logger
import (
"io"
"os"
"path"
"sync/atomic"
"github.com/cooperspencer/gickup/types"
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"
"gopkg.in/natefinch/lumberjack.v2"
)
var (
exitcode int32
)
// NewRollingFile TODO.
func NewRollingFile(config types.FileLogging) io.Writer {
if config.Dir != "" {
if err := os.MkdirAll(config.Dir, 0o744); err != nil {
log.Error().
Err(err).
Str("path", config.Dir).
Msg("can't create log directory")
return nil
}
} else {
config.Dir = "."
}
return &lumberjack.Logger{
Filename: path.Join(config.Dir, config.File),
MaxAge: config.MaxAge, // days
}
}
// CreateLogger create an instance of Logger.
func CreateLogger(conf types.Logging) zerolog.Logger {
var writers []io.Writer
writers = append(writers, zerolog.ConsoleWriter{Out: os.Stderr, TimeFormat: conf.Timeformat})
if conf.FileLogging.File != "" {
writers = append(writers, NewRollingFile(conf.FileLogging))
}
mw := io.MultiWriter(writers...)
logger := zerolog.New(mw).With().Timestamp().Logger()
// Attach the error hook to the main logger
return logger.Hook(&ErrorHook{})
}
// CreateSubLogger create a sublogger for modules
func CreateSubLogger(args ...string) zerolog.Logger {
sub := log.With()
for i := 0; i < len(args); i += 2 {
if i+1 < len(args) {
key := args[i]
value := args[i+1]
// Add key-value pairs to the sublogger
sub = sub.Str(key, value)
}
}
return sub.Logger()
}
type ErrorHook struct{}
func GetExitCode() int32 {
return exitcode
}
func (h *ErrorHook) Run(e *zerolog.Event, level zerolog.Level, msg string) {
if level == zerolog.ErrorLevel {
atomic.StoreInt32(&exitcode, 1)
}
}