在Go语言中使用logrus库实现多日志记录器时,你的方法存在一些可以改进的地方。以下是更符合Go语言习惯的实现方案:
import (
"github.com/sirupsen/logrus"
"io"
"os"
)
// 多日志记录器管理器
type MultiLogger struct {
loggers map[string]*logrus.Logger
allLoggers []*logrus.Logger
}
// 创建新的多日志记录器
func NewMultiLogger() *MultiLogger {
return &MultiLogger{
loggers: make(map[string]*logrus.Logger),
allLoggers: make([]*logrus.Logger, 0),
}
}
// 添加日志记录器
func (m *MultiLogger) AddLogger(name string, logger *logrus.Logger) {
m.loggers[name] = logger
m.allLoggers = append(m.allLoggers, logger)
}
// 向所有记录器发送日志
func (m *MultiLogger) LogAll(level logrus.Level, args ...interface{}) {
for _, logger := range m.allLoggers {
entry := logger.WithFields(logrus.Fields{})
switch level {
case logrus.DebugLevel:
entry.Debug(args...)
case logrus.InfoLevel:
entry.Info(args...)
case logrus.WarnLevel:
entry.Warn(args...)
case logrus.ErrorLevel:
entry.Error(args...)
case logrus.FatalLevel:
entry.Fatal(args...)
case logrus.PanicLevel:
entry.Panic(args...)
}
}
}
// 特定级别的快捷方法
func (m *MultiLogger) DebugAll(args ...interface{}) {
m.LogAll(logrus.DebugLevel, args...)
}
func (m *MultiLogger) InfoAll(args ...interface{}) {
m.LogAll(logrus.InfoLevel, args...)
}
func (m *MultiLogger) ErrorAll(args ...interface{}) {
m.LogAll(logrus.ErrorLevel, args...)
}
// 获取特定记录器(用于单独记录)
func (m *MultiLogger) GetLogger(name string) *logrus.Logger {
return m.loggers[name]
}
// 配置和初始化
func setupLoggers() *MultiLogger {
multiLogger := NewMultiLogger()
// 标准输出记录器
stdoutLogger := logrus.New()
stdoutLogger.SetOutput(os.Stdout)
stdoutLogger.SetLevel(logrus.DebugLevel)
multiLogger.AddLogger("stdout", stdoutLogger)
// 标准错误记录器
stderrLogger := logrus.New()
stderrLogger.SetOutput(os.Stderr)
stderrLogger.SetLevel(logrus.WarnLevel)
multiLogger.AddLogger("stderr", stderrLogger)
// Splunk记录器(示例 - 实际需要根据Splunk集成方式调整)
splunkLogger := logrus.New()
// 这里配置Splunk特定的输出,比如HTTP传输或文件输出
splunkLogger.SetLevel(logrus.InfoLevel)
multiLogger.AddLogger("splunk", splunkLogger)
return multiLogger
}
// 使用示例
func main() {
loggers := setupLoggers()
// 向所有记录器发送日志
loggers.DebugAll("调试信息")
loggers.InfoAll("普通信息")
loggers.ErrorAll("错误信息: ", "某个错误")
// 向特定记录器发送日志
loggers.GetLogger("stdout").WithFields(logrus.Fields{
"component": "controller",
"operation": "reconcile",
}).Info("控制器协调操作")
// 使用LogAll方法自定义级别
loggers.LogAll(logrus.WarnLevel, "警告信息")
}
这个实现解决了你提到的两个问题:
-
简化日志调用:提供了DebugAll、InfoAll、ErrorAll等快捷方法,避免了冗长的日志语句。
-
统一日志记录:通过LogAll方法和快捷方法,可以用单条语句向所有配置的日志端点发送消息。
对于Splunk集成,你可以进一步扩展:
// Splunk专用的日志钩子
type SplunkHook struct {
splunkURL string
token string
}
func (h *SplunkHook) Levels() []logrus.Level {
return logrus.AllLevels
}
func (h *SplunkHook) Fire(entry *logrus.Entry) error {
// 实现Splunk HTTP事件收集器的逻辑
// 将entry.Data和entry.Message发送到Splunk
return nil
}
// 在setupLoggers中添加Splunk钩子
splunkLogger.AddHook(&SplunkHook{
splunkURL: "https://your-splunk-server:8088",
token: "your-splunk-token",
})
这种方法更符合Go语言的惯用法,提供了清晰的接口和灵活的可扩展性。