1
1
package logging
2
2
3
3
import (
4
+ "io"
4
5
"os"
5
6
"runtime"
6
7
"strings"
7
8
8
9
"github.com/centrifugal/centrifugo/v5/internal/config"
9
10
"github.com/centrifugal/centrifugo/v5/internal/logutils"
11
+ "github.com/mattn/go-isatty"
10
12
11
13
"github.com/centrifugal/centrifuge"
12
- "github.com/mattn/go-isatty"
13
14
"github.com/rs/zerolog"
14
15
"github.com/rs/zerolog/log"
15
16
)
@@ -80,8 +81,16 @@ func (h *centrifugeLogHandler) readEntries() {
80
81
continue
81
82
}
82
83
if entry .Fields != nil {
84
+ if entry .Error != nil {
85
+ l = l .Err (entry .Error )
86
+ delete (entry .Fields , "error" )
87
+ }
83
88
l .Fields (entry .Fields ).Msg (entry .Message )
84
89
} else {
90
+ if entry .Error != nil {
91
+ l = l .Err (entry .Error )
92
+ delete (entry .Fields , "error" )
93
+ }
85
94
l .Msg (entry .Message )
86
95
}
87
96
}
@@ -95,40 +104,59 @@ func (h *centrifugeLogHandler) Handle(entry centrifuge.LogEntry) {
95
104
}
96
105
}
97
106
98
- func configureConsoleWriter () {
107
+ func configureConsoleWriter () * zerolog. ConsoleWriter {
99
108
if isTerminalAttached () {
100
- log . Logger = log . Output ( zerolog.ConsoleWriter {
109
+ return & zerolog.ConsoleWriter {
101
110
Out : os .Stdout ,
102
111
TimeFormat : "2006-01-02 15:04:05" ,
103
112
FormatLevel : logutils .ConsoleFormatLevel (),
104
113
FormatErrFieldName : logutils .ConsoleFormatErrFieldName (),
105
114
FormatErrFieldValue : logutils .ConsoleFormatErrFieldValue (),
106
- })
115
+ }
107
116
}
117
+ return nil
108
118
}
109
119
110
120
func isTerminalAttached () bool {
111
121
return isatty .IsTerminal (os .Stdout .Fd ()) && runtime .GOOS != "windows"
112
122
}
113
123
114
124
func Setup (cfg config.Config ) (centrifuge.LogHandler , func ()) {
115
- configureConsoleWriter ()
125
+ var writers []io.Writer
126
+
127
+ var file * os.File
128
+ if cfg .LogFile != "" {
129
+ var err error
130
+ file , err = os .OpenFile (cfg .LogFile , os .O_RDWR | os .O_CREATE | os .O_APPEND , 0644 )
131
+ if err != nil {
132
+ log .Fatal ().Err (err ).Msg ("error opening log file" )
133
+ }
134
+ writers = append (writers , file )
135
+ } else {
136
+ consoleWriter := configureConsoleWriter ()
137
+ if consoleWriter != nil {
138
+ writers = append (writers , consoleWriter )
139
+ } else {
140
+ writers = append (writers , os .Stderr )
141
+ }
142
+ }
143
+
116
144
logLevel , ok := logLevelMatches [strings .ToUpper (cfg .LogLevel )]
117
145
if ! ok {
118
146
logLevel = zerolog .InfoLevel
119
147
}
120
148
zerolog .SetGlobalLevel (logLevel )
121
- if cfg .LogFile != "" {
122
- f , err := os .OpenFile (cfg .LogFile , os .O_RDWR | os .O_CREATE | os .O_APPEND , 0644 )
123
- if err != nil {
124
- log .Fatal ().Err (err ).Msg ("error opening log file" )
125
- }
126
- log .Logger = log .Output (f )
127
- return newCentrifugeLogHandler ().Handle , func () {
128
- _ = f .Close ()
149
+
150
+ if len (writers ) > 0 {
151
+ mw := io .MultiWriter (writers ... )
152
+ log .Logger = log .Output (mw )
153
+ }
154
+
155
+ return newCentrifugeLogHandler ().Handle , func () {
156
+ if file != nil {
157
+ _ = file .Close ()
129
158
}
130
159
}
131
- return newCentrifugeLogHandler ().Handle , nil
132
160
}
133
161
134
162
// Enabled checks if a specific logging level is enabled
0 commit comments