【问题标题】:Create multiple Logfiles with dynamic Names with log4net使用 log4net 创建多个具有动态名称的日志文件
【发布时间】:2015-10-13 06:13:13
【问题描述】:

我在 Windows 服务中使用 log4net。该服务处理一些 RFID 阅读器。目前,我们将所有 Reader 的所有任务记录在一个日志文件中。这工作正常。 但现在我想将每个阅读器的任务记录在一个单独的文件中。阅读器由其 IP 地址标识。所以我想把 IP 地址作为文件名的一部分。

log4net 中创建动态文件附加程序的选项似乎不适合我,因为我每次写日志时都必须管理从阅读器到日志文件的分配。

在 log4net 中是否有适当的方法可以做到这一点,还是不可能?

【问题讨论】:

  • “每次我写日志时,我都必须管理从阅读器到日志文件的分配”——是的,你会的。当 reader 发生变化时,需要通知 log4net 它需要更改用于记录的文件。是否同时使用多个阅读器?
  • 是的,阅读器是同时使用的。实际我正在尝试为每个阅读器动态创建记录器。
  • 所以你要为每个动态记录器创建一个文件附加器?听起来应该可以。

标签: log4net


【解决方案1】:

在我的 Logclass 中,我为我的 Loggers 使用了 Dictionary<string, ILog>。我已经重载了方法,它们要么使用 Default-Logger,要么获取 Dictionary 的 Key 以使用指定的 Logger。

public static class Log
{
    private static readonly Dictionary<string, ILog> loggers = new Dictionary<string, ILog>();

    static Log()
    {
        XmlConfigurator.Configure();
    }

    public static void Debug(string message)
    {
        Debug(Logger.Default, message);
    }

    public static void Debug(string readerIp, string message)
    {
        GetLoggerInternal(readerIp).Debug(message);
    }

    private static ILog GetLoggerInternal(string logger)
    {
        if (!loggers.ContainsKey(logger))
        {
            var appender = CreateRollingFileAppender(logger);
            appender.ActivateOptions();
            loggers.Add(logger, LogManager.GetLogger(logger));
            ((log4net.Repository.Hierarchy.Logger)loggers[logger].Logger).AddAppender(appender);
        }
        return loggers[logger];
    }

    private static RollingFileAppender CreateRollingFileAppender(string readingPointIp)
    {
        var layout = new PatternLayout
        {
            ConversionPattern = "%date [%thread] %-5level %logger [%property{NDC}] - %message%newline"
        };
        layout.ActivateOptions();

        return new RollingFileAppender
        {
            Name = readingPointIp,
            AppendToFile = true,
            DatePattern = "yyyyMMdd",
            MaximumFileSize = "1MB",
            MaxSizeRollBackups = 10,
            RollingStyle = RollingFileAppender.RollingMode.Composite,
            File = $"..\\Log\\{readingPointIp}_log.txt",
            Layout = layout
        };
    }
}

调用.ActivateOptions(); 方法很重要,它们会实例化Appender 和Layout 类。我使用LogManager.GetLogger 创建一个新的记录器。要添加附加程序,我必须强制转换记录器,以使用 AddAppender

现在我只需拨打Log.Debug(readingPoint.IpAddress, "Some readingpoint specific log message."); 并将此消息保存在一个文件中,并在其名称中包含 IP 地址。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多