2021-06-11 05:05:43 +08:00
|
|
|
package testutil
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"fmt"
|
2022-10-26 18:06:08 +08:00
|
|
|
"log"
|
2022-11-17 22:03:04 +08:00
|
|
|
"sync"
|
2021-06-11 05:05:43 +08:00
|
|
|
|
|
|
|
|
"github.com/influxdata/telegraf"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
var _ telegraf.Logger = &CaptureLogger{}
|
|
|
|
|
|
2023-05-18 01:11:52 +08:00
|
|
|
const (
|
|
|
|
|
LevelError = 'E'
|
|
|
|
|
LevelWarn = 'W'
|
|
|
|
|
LevelInfo = 'I'
|
|
|
|
|
LevelDebug = 'D'
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
type Entry struct {
|
|
|
|
|
Level byte
|
|
|
|
|
Name string
|
|
|
|
|
Text string
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (e *Entry) String() string {
|
|
|
|
|
return fmt.Sprintf("%c! [%s] %s", e.Level, e.Name, e.Text)
|
|
|
|
|
}
|
|
|
|
|
|
2021-06-11 05:05:43 +08:00
|
|
|
// CaptureLogger defines a logging structure for plugins.
|
|
|
|
|
type CaptureLogger struct {
|
2023-05-18 01:11:52 +08:00
|
|
|
Name string // Name is the plugin name, will be printed in the `[]`.
|
|
|
|
|
messages []Entry
|
2022-11-17 22:03:04 +08:00
|
|
|
sync.Mutex
|
2021-06-11 05:05:43 +08:00
|
|
|
}
|
|
|
|
|
|
2023-05-18 01:11:52 +08:00
|
|
|
func (l *CaptureLogger) print(msg Entry) {
|
2022-11-17 22:03:04 +08:00
|
|
|
l.Lock()
|
2023-05-18 01:11:52 +08:00
|
|
|
l.messages = append(l.messages, msg)
|
2022-11-17 22:03:04 +08:00
|
|
|
l.Unlock()
|
2023-05-18 01:11:52 +08:00
|
|
|
log.Print(msg.String())
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (l *CaptureLogger) logf(level byte, format string, args ...any) {
|
|
|
|
|
l.print(Entry{level, l.Name, fmt.Sprintf(format, args...)})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (l *CaptureLogger) loga(level byte, args ...any) {
|
|
|
|
|
l.print(Entry{level, l.Name, fmt.Sprint(args...)})
|
|
|
|
|
}
|
|
|
|
|
|
2024-05-11 05:43:43 +08:00
|
|
|
func (l *CaptureLogger) Level() telegraf.LogLevel {
|
|
|
|
|
return telegraf.Debug
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (*CaptureLogger) RegisterErrorCallback(func()) {}
|
|
|
|
|
|
2023-05-18 01:11:52 +08:00
|
|
|
// Errorf logs an error message, patterned after log.Printf.
|
|
|
|
|
func (l *CaptureLogger) Errorf(format string, args ...interface{}) {
|
|
|
|
|
l.logf(LevelError, format, args...)
|
2021-06-11 05:05:43 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Error logs an error message, patterned after log.Print.
|
|
|
|
|
func (l *CaptureLogger) Error(args ...interface{}) {
|
2023-05-18 01:11:52 +08:00
|
|
|
l.loga(LevelError, args...)
|
2021-06-11 05:05:43 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Debugf logs a debug message, patterned after log.Printf.
|
|
|
|
|
func (l *CaptureLogger) Debugf(format string, args ...interface{}) {
|
2023-05-18 01:11:52 +08:00
|
|
|
l.logf(LevelDebug, format, args...)
|
2021-06-11 05:05:43 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Debug logs a debug message, patterned after log.Print.
|
|
|
|
|
func (l *CaptureLogger) Debug(args ...interface{}) {
|
2023-05-18 01:11:52 +08:00
|
|
|
l.loga(LevelDebug, args...)
|
2021-06-11 05:05:43 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Warnf logs a warning message, patterned after log.Printf.
|
|
|
|
|
func (l *CaptureLogger) Warnf(format string, args ...interface{}) {
|
2023-05-18 01:11:52 +08:00
|
|
|
l.logf(LevelWarn, format, args...)
|
2021-06-11 05:05:43 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Warn logs a warning message, patterned after log.Print.
|
|
|
|
|
func (l *CaptureLogger) Warn(args ...interface{}) {
|
2023-05-18 01:11:52 +08:00
|
|
|
l.loga(LevelWarn, args...)
|
2021-06-11 05:05:43 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Infof logs an information message, patterned after log.Printf.
|
|
|
|
|
func (l *CaptureLogger) Infof(format string, args ...interface{}) {
|
2023-05-18 01:11:52 +08:00
|
|
|
l.logf(LevelInfo, format, args...)
|
2021-06-11 05:05:43 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Info logs an information message, patterned after log.Print.
|
|
|
|
|
func (l *CaptureLogger) Info(args ...interface{}) {
|
2023-05-18 01:11:52 +08:00
|
|
|
l.loga(LevelInfo, args...)
|
2021-06-11 05:05:43 +08:00
|
|
|
}
|
2022-11-17 22:03:04 +08:00
|
|
|
|
2024-02-24 03:20:39 +08:00
|
|
|
func (l *CaptureLogger) NMessages() int {
|
|
|
|
|
l.Lock()
|
|
|
|
|
defer l.Unlock()
|
|
|
|
|
return len(l.messages)
|
|
|
|
|
}
|
|
|
|
|
|
2023-05-18 01:11:52 +08:00
|
|
|
func (l *CaptureLogger) Messages() []Entry {
|
|
|
|
|
l.Lock()
|
|
|
|
|
msgs := make([]Entry, len(l.messages))
|
|
|
|
|
copy(msgs, l.messages)
|
|
|
|
|
l.Unlock()
|
|
|
|
|
return msgs
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (l *CaptureLogger) filter(level byte) []string {
|
2022-11-17 22:03:04 +08:00
|
|
|
l.Lock()
|
|
|
|
|
defer l.Unlock()
|
2023-05-18 01:11:52 +08:00
|
|
|
var msgs []string
|
|
|
|
|
for _, m := range l.messages {
|
|
|
|
|
if m.Level == level {
|
|
|
|
|
msgs = append(msgs, m.String())
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return msgs
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (l *CaptureLogger) Errors() []string {
|
|
|
|
|
return l.filter(LevelError)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (l *CaptureLogger) Warnings() []string {
|
|
|
|
|
return l.filter(LevelWarn)
|
2022-11-17 22:03:04 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (l *CaptureLogger) LastError() string {
|
|
|
|
|
l.Lock()
|
|
|
|
|
defer l.Unlock()
|
2023-05-18 01:11:52 +08:00
|
|
|
for i := len(l.messages) - 1; i >= 0; i-- {
|
|
|
|
|
if l.messages[i].Level == LevelError {
|
|
|
|
|
return l.messages[i].String()
|
|
|
|
|
}
|
2022-11-17 22:03:04 +08:00
|
|
|
}
|
|
|
|
|
return ""
|
|
|
|
|
}
|
2023-05-19 21:05:24 +08:00
|
|
|
|
|
|
|
|
func (l *CaptureLogger) Clear() {
|
|
|
|
|
l.Lock()
|
|
|
|
|
defer l.Unlock()
|
|
|
|
|
l.messages = make([]Entry, 0)
|
|
|
|
|
}
|