telegraf/logger/logger.go

96 lines
2.3 KiB
Go
Raw Normal View History

package logger
import (
2019-05-03 17:25:28 +00:00
"errors"
"io"
"log"
"os"
2017-04-12 17:41:26 +00:00
"regexp"
"time"
2019-05-03 17:25:28 +00:00
"github.com/influxdata/telegraf/internal"
"github.com/influxdata/telegraf/internal/rotate"
"github.com/influxdata/wlog"
)
2017-04-12 17:41:26 +00:00
var prefixRegex = regexp.MustCompile("^[DIWE]!")
// newTelegrafWriter returns a logging-wrapped writer.
func newTelegrafWriter(w io.Writer) io.Writer {
return &telegrafLog{
2019-05-03 17:25:28 +00:00
writer: wlog.NewWriter(w),
internalWriter: w,
}
}
2019-05-03 17:25:28 +00:00
// 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 {
2019-05-03 17:25:28 +00:00
writer io.Writer
internalWriter io.Writer
}
func (t *telegrafLog) Write(b []byte) (n int, err error) {
2017-04-12 17:41:26 +00:00
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)
}
2019-05-03 17:25:28 +00:00
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.
2019-05-03 17:25:28 +00:00
func SetupLogging(config LogConfig) {
newLogWriter(config)
}
func newLogWriter(config LogConfig) io.Writer {
log.SetFlags(0)
2019-05-03 17:25:28 +00:00
if config.Debug {
wlog.SetLevel(wlog.DEBUG)
}
2019-05-03 17:25:28 +00:00
if config.Quiet {
wlog.SetLevel(wlog.ERROR)
}
2019-05-03 17:25:28 +00:00
var writer io.Writer
if config.Logfile != "" {
2019-02-28 00:33:38 +00:00
var err error
2019-05-03 17:25:28 +00:00
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 {
2019-05-03 17:25:28 +00:00
writer = os.Stderr
}
2019-05-03 17:25:28 +00:00
telegrafLog := newTelegrafWriter(writer)
log.SetOutput(telegrafLog)
return telegrafLog
}