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

时间:2015-10-13 06:13:14

标签: log4net

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

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

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

1 个答案:

答案 0 :(得分:0)

在我的Logclass中,我使用Dictionary<string, ILog>作为Loggers。我重载了方法,要么使用Default-Logger,要么使用Dictionary的密钥来使用指定的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和布局类。我使用LogManager.GetLogger创建一个新的Logger。要添加追加器我要投射记录器,使用AddAppender

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