96 lines
2.3 KiB
Go
96 lines
2.3 KiB
Go
package logger
|
|
|
|
import (
|
|
"errors"
|
|
"io"
|
|
"log"
|
|
"os"
|
|
"regexp"
|
|
"time"
|
|
|
|
"github.com/influxdata/telegraf/internal"
|
|
"github.com/influxdata/telegraf/internal/rotate"
|
|
"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),
|
|
internalWriter: w,
|
|
}
|
|
}
|
|
|
|
// LogConfig contains the log configuration settings
|
|
type LogConfig struct {
|
|
// will set the log level to DEBUG
|
|
Debug bool
|
|
//will set the log level to ERROR
|
|
Quiet bool
|
|
// 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
|
|
Logfile string
|
|
// will rotate when current file at the specified time interval
|
|
RotationInterval internal.Duration
|
|
// will rotate when current file size exceeds this parameter.
|
|
RotationMaxSize internal.Size
|
|
// maximum rotated files to keep (older ones will be deleted)
|
|
RotationMaxArchives int
|
|
}
|
|
|
|
type telegrafLog struct {
|
|
writer io.Writer
|
|
internalWriter 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)
|
|
}
|
|
|
|
func (t *telegrafLog) Close() error {
|
|
closer, isCloser := t.internalWriter.(io.Closer)
|
|
if !isCloser {
|
|
return errors.New("the underlying writer cannot be closed")
|
|
}
|
|
return closer.Close()
|
|
}
|
|
|
|
// SetupLogging configures the logging output.
|
|
func SetupLogging(config LogConfig) {
|
|
newLogWriter(config)
|
|
}
|
|
|
|
func newLogWriter(config LogConfig) io.Writer {
|
|
log.SetFlags(0)
|
|
if config.Debug {
|
|
wlog.SetLevel(wlog.DEBUG)
|
|
}
|
|
if config.Quiet {
|
|
wlog.SetLevel(wlog.ERROR)
|
|
}
|
|
|
|
var writer io.Writer
|
|
if config.Logfile != "" {
|
|
var err error
|
|
if writer, err = rotate.NewFileWriter(config.Logfile, config.RotationInterval.Duration, config.RotationMaxSize.Size, config.RotationMaxArchives); err != nil {
|
|
log.Printf("E! Unable to open %s (%s), using stderr", config.Logfile, err)
|
|
writer = os.Stderr
|
|
}
|
|
} else {
|
|
writer = os.Stderr
|
|
}
|
|
|
|
telegrafLog := newTelegrafWriter(writer)
|
|
log.SetOutput(telegrafLog)
|
|
return telegrafLog
|
|
}
|