70 lines
1.6 KiB
Go
70 lines
1.6 KiB
Go
package logger
|
|
|
|
import (
|
|
"io"
|
|
"log"
|
|
"os"
|
|
"regexp"
|
|
"time"
|
|
|
|
"github.com/influxdata/wlog"
|
|
)
|
|
|
|
var prefixRegex = regexp.MustCompile("^[DIWE]!")
|
|
|
|
// newTelegrafWriter returns a logging-wrapped writer.
|
|
func newTelegrafWriter(w io.Writer) io.Writer {
|
|
return &telegrafLog{
|
|
writer: wlog.NewWriter(w),
|
|
}
|
|
}
|
|
|
|
type telegrafLog struct {
|
|
writer io.Writer
|
|
}
|
|
|
|
func (t *telegrafLog) Write(b []byte) (n int, err error) {
|
|
var line []byte
|
|
if !prefixRegex.Match(b) {
|
|
line = append([]byte(time.Now().UTC().Format(time.RFC3339)+" I! "), b...)
|
|
} else {
|
|
line = append([]byte(time.Now().UTC().Format(time.RFC3339)+" "), b...)
|
|
}
|
|
return t.writer.Write(line)
|
|
}
|
|
|
|
// SetupLogging configures the logging output.
|
|
// debug will set the log level to DEBUG
|
|
// quiet will set the log level to ERROR
|
|
// logfile will direct the logging output to a file. Empty string is
|
|
// interpreted as stderr. If there is an error opening the file the
|
|
// logger will fallback to stderr.
|
|
func SetupLogging(debug, quiet bool, logfile string) {
|
|
log.SetFlags(0)
|
|
if debug {
|
|
wlog.SetLevel(wlog.DEBUG)
|
|
}
|
|
if quiet {
|
|
wlog.SetLevel(wlog.ERROR)
|
|
}
|
|
|
|
var oFile *os.File
|
|
if logfile != "" {
|
|
if _, err := os.Stat(logfile); os.IsNotExist(err) {
|
|
if oFile, err = os.Create(logfile); err != nil {
|
|
log.Printf("E! Unable to create %s (%s), using stderr", logfile, err)
|
|
oFile = os.Stderr
|
|
}
|
|
} else {
|
|
if oFile, err = os.OpenFile(logfile, os.O_APPEND|os.O_WRONLY, os.ModeAppend); err != nil {
|
|
log.Printf("E! Unable to append to %s (%s), using stderr", logfile, err)
|
|
oFile = os.Stderr
|
|
}
|
|
}
|
|
} else {
|
|
oFile = os.Stderr
|
|
}
|
|
|
|
log.SetOutput(newTelegrafWriter(oFile))
|
|
}
|