使用 log4net 创建多个具有动态名称的日志文件

Create multiple Logfiles with dynamic Names with log4net

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

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

在 log4net 中是否有适当的方法来执行此操作,或者不可能?

在我的日志类中,我为记录器使用了 Dictionary<string, ILog>。我已经重载了方法,它们要么使用默认记录器,要么获得 Dictionary 的密钥以使用指定的记录器。

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 创建一个新的记录器。要添加 appender,我必须转换记录器,使用 AddAppender.

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