@@ -92,7 +92,7 @@ var colorRed = "\033[31m"
9292var colorBlack = "\033 [0m"
9393
9494func (v * loggerPlus ) doPrintln (args ... interface {}) {
95- if previousIo == nil {
95+ if previousCloser == nil {
9696 if v == Error {
9797 fmt .Fprintf (os .Stdout , colorRed )
9898 v .logger .Println (args ... )
@@ -110,7 +110,7 @@ func (v *loggerPlus) doPrintln(args ...interface{}) {
110110}
111111
112112func (v * loggerPlus ) doPrintf (format string , args ... interface {}) {
113- if previousIo == nil {
113+ if previousCloser == nil {
114114 if v == Error {
115115 fmt .Fprintf (os .Stdout , colorRed )
116116 v .logger .Printf (format , args ... )
@@ -191,26 +191,36 @@ type Logger interface {
191191func init () {
192192 Info = NewLoggerPlus (log .New (ioutil .Discard , logInfoLabel , log .Ldate | log .Ltime | log .Lmicroseconds ))
193193 Trace = NewLoggerPlus (log .New (os .Stdout , logTraceLabel , log .Ldate | log .Ltime | log .Lmicroseconds ))
194- Warn = NewLoggerPlus (log .New (os .Stdout , logWarnLabel , log .Ldate | log .Ltime | log .Lmicroseconds ))
195- Error = NewLoggerPlus (log .New (os .Stdout , logErrorLabel , log .Ldate | log .Ltime | log .Lmicroseconds ))
194+ Warn = NewLoggerPlus (log .New (os .Stderr , logWarnLabel , log .Ldate | log .Ltime | log .Lmicroseconds ))
195+ Error = NewLoggerPlus (log .New (os .Stderr , logErrorLabel , log .Ldate | log .Ltime | log .Lmicroseconds ))
196+
197+ // init writer and closer.
198+ previousWriter = os .Stdout
199+ previousCloser = nil
196200}
197201
198202// Switch the underlayer io.
199203// @remark user must close previous io for logger never close it.
200- func Switch (w io.Writer ) {
204+ func Switch (w io.Writer ) io. Writer {
201205 // TODO: support level, default to trace here.
202206 Info = NewLoggerPlus (log .New (ioutil .Discard , logInfoLabel , log .Ldate | log .Ltime | log .Lmicroseconds ))
203207 Trace = NewLoggerPlus (log .New (w , logTraceLabel , log .Ldate | log .Ltime | log .Lmicroseconds ))
204208 Warn = NewLoggerPlus (log .New (w , logWarnLabel , log .Ldate | log .Ltime | log .Lmicroseconds ))
205209 Error = NewLoggerPlus (log .New (w , logErrorLabel , log .Ldate | log .Ltime | log .Lmicroseconds ))
206210
207- if w , ok := w .(io.Closer ); ok {
208- previousIo = w
211+ ow := previousWriter
212+ previousWriter = w
213+
214+ if c , ok := w .(io.Closer ); ok {
215+ previousCloser = c
209216 }
217+
218+ return ow
210219}
211220
212221// The previous underlayer io for logger.
213- var previousIo io.Closer
222+ var previousCloser io.Closer
223+ var previousWriter io.Writer
214224
215225// The interface io.Closer
216226// Cleanup the logger, discard any log util switch to fresh writer.
@@ -220,9 +230,9 @@ func Close() (err error) {
220230 Warn = NewLoggerPlus (log .New (ioutil .Discard , logWarnLabel , log .Ldate | log .Ltime | log .Lmicroseconds ))
221231 Error = NewLoggerPlus (log .New (ioutil .Discard , logErrorLabel , log .Ldate | log .Ltime | log .Lmicroseconds ))
222232
223- if previousIo != nil {
224- err = previousIo .Close ()
225- previousIo = nil
233+ if previousCloser != nil {
234+ err = previousCloser .Close ()
235+ previousCloser = nil
226236 }
227237
228238 return
0 commit comments