@@ -3,16 +3,21 @@ package main
3
3
import (
4
4
"context"
5
5
"flag"
6
+ "fmt"
7
+ "io"
6
8
"log/syslog"
7
9
"net/http"
8
10
"os"
9
11
"os/signal"
12
+ "path"
10
13
"syscall"
11
14
"time"
12
15
13
16
"github.com/prometheus/client_golang/prometheus/promhttp"
14
17
"github.com/rs/zerolog"
15
18
"github.com/rs/zerolog/log"
19
+ "golang.org/x/sys/unix"
20
+ "gopkg.in/natefinch/lumberjack.v2"
16
21
17
22
"github.com/shmel1k/qumomf/internal/config"
18
23
"github.com/shmel1k/qumomf/internal/coordinator"
@@ -80,26 +85,57 @@ func main() {
80
85
func initLogger (cfg * config.Config ) zerolog.Logger {
81
86
zerolog .TimeFieldFormat = zerolog .TimeFormatUnix
82
87
83
- logLevel , err := zerolog .ParseLevel (cfg .Qumomf .LogLevel )
88
+ loggingCfg := cfg .Qumomf .Logging
89
+
90
+ logLevel , err := zerolog .ParseLevel (loggingCfg .Level )
84
91
if err != nil {
85
- log .Warn ().Msgf ("Unknown Level String: '%s', defaulting to DebugLevel" , cfg . Qumomf . LogLevel )
92
+ log .Warn ().Msgf ("Unknown Level String: '%s', defaulting to DebugLevel" , loggingCfg . Level )
86
93
logLevel = zerolog .DebugLevel
87
94
}
88
95
89
- base := zerolog .New (os .Stdout ).Level (logLevel ).With ().Timestamp ().Logger ()
96
+ writers := make ([]io.Writer , 0 , 1 )
97
+ writers = append (writers , os .Stdout )
90
98
91
- if cfg . Qumomf . EnableSysLog {
99
+ if loggingCfg . SysLogEnabled {
92
100
w , err := syslog .New (syslog .LOG_INFO , "qumomf" )
93
101
if err != nil {
94
102
log .Warn ().Err (err ).Msg ("Unable to connect to the system log daemon" )
95
- return base
103
+ } else {
104
+ writers = append (writers , zerolog .SyslogLevelWriter (w ))
105
+ }
106
+ }
107
+
108
+ if loggingCfg .FileLoggingEnabled {
109
+ w , err := newRollingLogFile (& loggingCfg )
110
+ if err != nil {
111
+ log .Warn ().Err (err ).Msg ("Unable to init file logger" )
112
+ } else {
113
+ writers = append (writers , w )
96
114
}
97
- syslogWriter := zerolog .SyslogLevelWriter (w )
115
+ }
116
+
117
+ var baseLogger zerolog.Logger
118
+ if len (writers ) == 1 {
119
+ baseLogger = zerolog .New (writers [0 ])
120
+ } else {
121
+ return zerolog .New (zerolog .MultiLevelWriter (writers ... ))
122
+ }
123
+
124
+ return baseLogger .Level (logLevel ).With ().Timestamp ().Logger ()
125
+ }
98
126
99
- return zerolog .New (zerolog .MultiLevelWriter (os .Stdout , syslogWriter )).Level (logLevel ).With ().Timestamp ().Logger ()
127
+ func newRollingLogFile (cfg * config.Logging ) (io.Writer , error ) {
128
+ dir := path .Dir (cfg .Filename )
129
+ if unix .Access (dir , unix .W_OK ) != nil {
130
+ return nil , fmt .Errorf ("no permissions to write logs to dir: %s" , dir )
100
131
}
101
132
102
- return base
133
+ return & lumberjack.Logger {
134
+ Filename : cfg .Filename ,
135
+ MaxBackups : cfg .MaxBackups ,
136
+ MaxSize : cfg .MaxSize ,
137
+ MaxAge : cfg .MaxAge ,
138
+ }, nil
103
139
}
104
140
105
141
func initHTTPServer (port string ) * http.Server {
0 commit comments