2024-05-11 05:43:43 +08:00
|
|
|
package logger
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"errors"
|
|
|
|
|
"io"
|
|
|
|
|
"log"
|
|
|
|
|
"os"
|
|
|
|
|
"strings"
|
|
|
|
|
"time"
|
|
|
|
|
|
2024-06-25 21:48:56 +08:00
|
|
|
"github.com/influxdata/telegraf"
|
2024-05-11 05:43:43 +08:00
|
|
|
"github.com/influxdata/telegraf/internal/rotate"
|
|
|
|
|
"github.com/influxdata/wlog"
|
|
|
|
|
)
|
|
|
|
|
|
2024-06-17 16:20:02 +08:00
|
|
|
const (
|
|
|
|
|
LogTargetFile = "file"
|
|
|
|
|
LogTargetStderr = "stderr"
|
|
|
|
|
)
|
|
|
|
|
|
2024-05-11 05:43:43 +08:00
|
|
|
type defaultLogger struct {
|
2024-06-25 21:48:56 +08:00
|
|
|
Category string
|
|
|
|
|
Name string
|
|
|
|
|
Alias string
|
|
|
|
|
LogLevel telegraf.LogLevel
|
|
|
|
|
|
|
|
|
|
prefix string
|
|
|
|
|
onError []func()
|
|
|
|
|
|
2024-05-11 05:43:43 +08:00
|
|
|
writer io.Writer
|
|
|
|
|
internalWriter io.Writer
|
|
|
|
|
timezone *time.Location
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (t *defaultLogger) Write(b []byte) (n int, err error) {
|
|
|
|
|
var line []byte
|
|
|
|
|
timeToPrint := time.Now().In(t.timezone)
|
|
|
|
|
|
|
|
|
|
if !prefixRegex.Match(b) {
|
|
|
|
|
line = append([]byte(timeToPrint.Format(time.RFC3339)+" I! "), b...)
|
|
|
|
|
} else {
|
|
|
|
|
line = append([]byte(timeToPrint.Format(time.RFC3339)+" "), b...)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return t.writer.Write(line)
|
|
|
|
|
}
|
|
|
|
|
|
2024-06-25 21:48:56 +08:00
|
|
|
// NewLogger creates a new logger instance
|
|
|
|
|
func (t *defaultLogger) New(category, name, alias string) telegraf.Logger {
|
|
|
|
|
var prefix string
|
|
|
|
|
if category != "" {
|
|
|
|
|
prefix = "[" + category
|
|
|
|
|
if name != "" {
|
|
|
|
|
prefix += "." + name
|
|
|
|
|
}
|
|
|
|
|
if alias != "" {
|
|
|
|
|
prefix += "::" + alias
|
|
|
|
|
}
|
|
|
|
|
prefix += "] "
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return &defaultLogger{
|
|
|
|
|
Category: category,
|
|
|
|
|
Name: name,
|
|
|
|
|
Alias: alias,
|
|
|
|
|
LogLevel: t.LogLevel,
|
|
|
|
|
prefix: prefix,
|
|
|
|
|
writer: t.writer,
|
|
|
|
|
internalWriter: t.internalWriter,
|
|
|
|
|
timezone: t.timezone,
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-05-11 05:43:43 +08:00
|
|
|
func (t *defaultLogger) Close() error {
|
|
|
|
|
// avoid closing stderr
|
|
|
|
|
if t.internalWriter == os.Stderr {
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
closer, isCloser := t.internalWriter.(io.Closer)
|
|
|
|
|
if !isCloser {
|
|
|
|
|
return errors.New("the underlying writer cannot be closed")
|
|
|
|
|
}
|
|
|
|
|
return closer.Close()
|
|
|
|
|
}
|
|
|
|
|
|
2024-06-25 21:48:56 +08:00
|
|
|
// OnErr defines a callback that triggers only when errors are about to be written to the log
|
|
|
|
|
func (t *defaultLogger) RegisterErrorCallback(f func()) {
|
|
|
|
|
t.onError = append(t.onError, f)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (t *defaultLogger) Level() telegraf.LogLevel {
|
|
|
|
|
return t.LogLevel
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Errorf logs an error message, patterned after log.Printf.
|
|
|
|
|
func (t *defaultLogger) Errorf(format string, args ...interface{}) {
|
|
|
|
|
log.Printf("E! "+t.prefix+format, args...)
|
|
|
|
|
for _, f := range t.onError {
|
|
|
|
|
f()
|
2024-05-11 05:43:43 +08:00
|
|
|
}
|
2024-06-25 21:48:56 +08:00
|
|
|
}
|
2024-05-11 05:43:43 +08:00
|
|
|
|
2024-06-25 21:48:56 +08:00
|
|
|
// Error logs an error message, patterned after log.Print.
|
|
|
|
|
func (t *defaultLogger) Error(args ...interface{}) {
|
|
|
|
|
for _, f := range t.onError {
|
|
|
|
|
f()
|
2024-05-11 05:43:43 +08:00
|
|
|
}
|
2024-06-25 21:48:56 +08:00
|
|
|
log.Print(append([]interface{}{"E! " + t.prefix}, args...)...)
|
|
|
|
|
}
|
2024-05-11 05:43:43 +08:00
|
|
|
|
2024-06-25 21:48:56 +08:00
|
|
|
// Debugf logs a debug message, patterned after log.Printf.
|
|
|
|
|
func (t *defaultLogger) Debugf(format string, args ...interface{}) {
|
|
|
|
|
log.Printf("D! "+t.prefix+" "+format, args...)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Debug logs a debug message, patterned after log.Print.
|
|
|
|
|
func (t *defaultLogger) Debug(args ...interface{}) {
|
|
|
|
|
log.Print(append([]interface{}{"D! " + t.prefix}, args...)...)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Warnf logs a warning message, patterned after log.Printf.
|
|
|
|
|
func (t *defaultLogger) Warnf(format string, args ...interface{}) {
|
|
|
|
|
log.Printf("W! "+t.prefix+format, args...)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Warn logs a warning message, patterned after log.Print.
|
|
|
|
|
func (t *defaultLogger) Warn(args ...interface{}) {
|
|
|
|
|
log.Print(append([]interface{}{"W! " + t.prefix}, args...)...)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Infof logs an information message, patterned after log.Printf.
|
|
|
|
|
func (t *defaultLogger) Infof(format string, args ...interface{}) {
|
|
|
|
|
log.Printf("I! "+t.prefix+format, args...)
|
2024-05-11 05:43:43 +08:00
|
|
|
}
|
|
|
|
|
|
2024-06-25 21:48:56 +08:00
|
|
|
// Info logs an information message, patterned after log.Print.
|
|
|
|
|
func (t *defaultLogger) Info(args ...interface{}) {
|
|
|
|
|
log.Print(append([]interface{}{"I! " + t.prefix}, args...)...)
|
2024-05-11 05:43:43 +08:00
|
|
|
}
|
|
|
|
|
|
2024-06-25 21:48:56 +08:00
|
|
|
func createDefaultLogger(cfg *Config) (logger, error) {
|
|
|
|
|
log.SetFlags(0)
|
|
|
|
|
|
|
|
|
|
// Set the log-level
|
|
|
|
|
switch cfg.logLevel {
|
|
|
|
|
case telegraf.Error:
|
|
|
|
|
wlog.SetLevel(wlog.ERROR)
|
|
|
|
|
case telegraf.Warn:
|
|
|
|
|
wlog.SetLevel(wlog.WARN)
|
|
|
|
|
case telegraf.Info:
|
|
|
|
|
wlog.SetLevel(wlog.INFO)
|
|
|
|
|
case telegraf.Debug:
|
|
|
|
|
wlog.SetLevel(wlog.DEBUG)
|
2024-05-11 05:43:43 +08:00
|
|
|
}
|
|
|
|
|
|
2024-06-25 21:48:56 +08:00
|
|
|
// Setup the writer target
|
|
|
|
|
var writer io.Writer = os.Stderr
|
|
|
|
|
if cfg.LogTarget == "file" && cfg.Logfile != "" {
|
|
|
|
|
w, err := rotate.NewFileWriter(
|
|
|
|
|
cfg.Logfile,
|
|
|
|
|
cfg.RotationInterval,
|
|
|
|
|
cfg.RotationMaxSize,
|
|
|
|
|
cfg.RotationMaxArchives,
|
|
|
|
|
)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
writer = w
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Get configured timezone
|
|
|
|
|
timezoneName := cfg.LogWithTimezone
|
|
|
|
|
if strings.EqualFold(timezoneName, "local") {
|
|
|
|
|
timezoneName = "Local"
|
|
|
|
|
}
|
|
|
|
|
tz, err := time.LoadLocation(timezoneName)
|
2024-05-11 05:43:43 +08:00
|
|
|
if err != nil {
|
2024-06-25 21:48:56 +08:00
|
|
|
return nil, errors.New("error while setting logging timezone: " + err.Error())
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Setup the logger
|
|
|
|
|
l := &defaultLogger{
|
|
|
|
|
writer: wlog.NewWriter(writer),
|
|
|
|
|
internalWriter: writer,
|
|
|
|
|
timezone: tz,
|
2024-05-11 05:43:43 +08:00
|
|
|
}
|
|
|
|
|
|
2024-06-25 21:48:56 +08:00
|
|
|
log.SetOutput(l)
|
|
|
|
|
return l, nil
|
2024-05-11 05:43:43 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func init() {
|
2024-06-25 21:48:56 +08:00
|
|
|
add("stderr", createDefaultLogger)
|
|
|
|
|
add("file", createDefaultLogger)
|
2024-05-11 05:43:43 +08:00
|
|
|
}
|