diff --git a/logger/go.mod b/logger/go.mod index a56e705..01a03a7 100644 --- a/logger/go.mod +++ b/logger/go.mod @@ -1,3 +1,12 @@ module git.haelnorr.com/haelnorr/golibh/logger go 1.25.5 + +require github.com/rs/zerolog v1.34.0 + +require ( + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.19 // indirect + github.com/pkg/errors v0.9.1 // indirect + golang.org/x/sys v0.12.0 // indirect +) diff --git a/logger/go.sum b/logger/go.sum new file mode 100644 index 0000000..1f7edd4 --- /dev/null +++ b/logger/go.sum @@ -0,0 +1,16 @@ +github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= +github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0= +github.com/rs/zerolog v1.34.0 h1:k43nTLIwcTVQAncfCw4KZ2VY6ukYoZaBPNOE8txlOeY= +github.com/rs/zerolog v1.34.0/go.mod h1:bJsvje4Z08ROH4Nhs5iH600c3IkWhwp44iRc54W6wYQ= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= diff --git a/logger/logger.go b/logger/logger.go new file mode 100644 index 0000000..b2810f0 --- /dev/null +++ b/logger/logger.go @@ -0,0 +1,84 @@ +package logging + +import ( + "io" + "os" + "path/filepath" + + "github.com/pkg/errors" + "github.com/rs/zerolog" + "github.com/rs/zerolog/pkgerrors" +) + +// Takes a log level as string and converts it to a zerolog.Level interface. +// If the string is not a valid input it will return zerolog.InfoLevel +func GetLogLevel(level string) zerolog.Level { + levels := map[string]zerolog.Level{ + "trace": zerolog.TraceLevel, + "debug": zerolog.DebugLevel, + "info": zerolog.InfoLevel, + "warn": zerolog.WarnLevel, + "error": zerolog.ErrorLevel, + "fatal": zerolog.FatalLevel, + "panic": zerolog.PanicLevel, + } + logLevel, valid := levels[level] + if !valid { + return zerolog.InfoLevel + } + return logLevel +} + +// Returns a pointer to a new log file with the specified path. +// Remember to call file.Close() when finished writing to the log file +func GetLogFile(path string) (*os.File, error) { + logPath := filepath.Join(path, "server.log") + file, err := os.OpenFile( + logPath, + os.O_APPEND|os.O_CREATE|os.O_WRONLY, + 0663, + ) + if err != nil { + return nil, errors.Wrap(err, "os.OpenFile") + } + return file, nil +} + +// Get a pointer to a new zerolog.Logger with the specified level and output +// Can provide a file, writer or both. Must provide at least one of the two +func GetLogger( + logLevel zerolog.Level, + w io.Writer, + logFile *os.File, + logDir string, +) (*zerolog.Logger, error) { + if w == nil && logFile == nil { + return nil, errors.New("No Writer provided for log output.") + } + + zerolog.TimeFieldFormat = zerolog.TimeFormatUnix + zerolog.ErrorStackMarshaler = pkgerrors.MarshalStack + + var consoleWriter zerolog.ConsoleWriter + if w != nil { + consoleWriter = zerolog.ConsoleWriter{Out: w} + } + + var output io.Writer + if logFile != nil { + if w != nil { + output = zerolog.MultiLevelWriter(logFile, consoleWriter) + } else { + output = logFile + } + } else { + output = consoleWriter + } + logger := zerolog.New(output). + With(). + Timestamp(). + Logger(). + Level(logLevel) + + return &logger, nil +}