Create multiple Logfiles with dynamic Names with log4net

拟墨画扇 提交于 2019-12-24 14:01:35

问题


I'm using log4net in a Windows Service. This Service processes some RFID Reader. Currently we are logging all tasks of all Reader in one Logfile. This works fine. But now I want to log the tasks of each Reader in a separate File. The Readers are identified by their IP Address. So I want to take the IP Address as part of the Filename.

The option in log4net to create dynamic file appenders seems not to fit for me, because I would have to manage the assignment from Reader to log file, each time I write a log.

Is there an appropriate way to do this in log4net, or is it not possible?


回答1:


In my Logclass I used a Dictionary<string, ILog> for my Loggers. I've overloaded methods, either they use the Default-Logger or they get the Key for the Dictionary to use the specified 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
        };
    }
}

It is important to call the .ActivateOptions(); methods, they instantiate the Appender and Layout Classes. I use LogManager.GetLogger to create a new Logger. To add the appender I've to cast the logger, to use AddAppender.

Now I just have to call Log.Debug(readingPoint.IpAddress, "Some readingpoint specific log message."); and I've this message in a file, with the IP Address in it's name.



来源:https://stackoverflow.com/questions/33095366/create-multiple-logfiles-with-dynamic-names-with-log4net

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!