mirror of https://github.com/Bios-Marcel/cordless
74 lines
1.6 KiB
Go
74 lines
1.6 KiB
Go
package logging
|
|
|
|
import (
|
|
"io"
|
|
"log"
|
|
"os"
|
|
)
|
|
|
|
var (
|
|
defaultWriter io.Writer
|
|
additionalWriter io.Writer
|
|
)
|
|
|
|
type doubleLogger struct {
|
|
defaultLogger io.Writer
|
|
additionalLogger io.Writer
|
|
}
|
|
|
|
// SetAdditionalOutput defines where we log to. This wraps the writer with another
|
|
// writer to allow a second logging location.
|
|
func SetAdditionalOutput(newAdditionalWriter io.Writer) {
|
|
additionalWriter = newAdditionalWriter
|
|
updateLogger()
|
|
}
|
|
|
|
// SetDefaultOutput defines the default location for logoutput. This can't
|
|
// be overriden by calling SetOutput.
|
|
func SetDefaultOutput(newDefaultWriter io.Writer) {
|
|
defaultWriter = newDefaultWriter
|
|
updateLogger()
|
|
|
|
}
|
|
|
|
func updateLogger() {
|
|
if defaultWriter != nil && additionalWriter != nil {
|
|
log.SetOutput(&doubleLogger{
|
|
defaultLogger: defaultWriter,
|
|
additionalLogger: additionalWriter,
|
|
})
|
|
} else if defaultWriter != nil {
|
|
log.SetOutput(defaultWriter)
|
|
} else if additionalWriter != nil {
|
|
log.SetOutput(additionalWriter)
|
|
} else {
|
|
log.SetOutput(os.Stdout)
|
|
}
|
|
}
|
|
|
|
// Write redirects the output to both the default logger and the additional
|
|
// logger. If any is null, it is skipped. If any errors, an error is returned.
|
|
func (l *doubleLogger) Write(p []byte) (n int, err error) {
|
|
var (
|
|
count int
|
|
writeErrorDefault error
|
|
writeErrorAdditional error
|
|
)
|
|
if l.defaultLogger != nil {
|
|
count, writeErrorDefault = l.defaultLogger.Write(p)
|
|
}
|
|
if l.additionalLogger != nil {
|
|
count, writeErrorAdditional = l.additionalLogger.Write(p)
|
|
}
|
|
|
|
if writeErrorDefault != nil {
|
|
return 0, writeErrorDefault
|
|
}
|
|
|
|
if writeErrorAdditional != nil {
|
|
return 0, writeErrorAdditional
|
|
}
|
|
|
|
return count, nil
|
|
}
|