Log4Net使用RollingFileAppender结合logdata和今天的属性

时间:2016-04-05 20:59:16

标签: .net log4net log4net-configuration log4net-appender

我正在使用web.config中的配置设置upp Log4Net,并希望根据与今天日期相结合的数据中的属性创建文本日志(RollingLogFileAppender)。 (这在代码中能够提前但是有点难看所以将所有内容移到web.config中):

BOOKINGS_20160405.txt这样的东西。

因此,如果我要记录的数据(带有键/值的字典)有一个名为Source:BOOKING的键,我想要上面的结果。此Source可以包含其他几个类别,并应保存到这些日志文件中。

我尝试了datePattern的几种方法,但找不到任何解决方案。

如果不为它编写一些代码,这是否可行? 也许我根本不应该使用RollingLogFileAppender?

也许我可以创建一个自定义附加制作我想要的东西?

1 个答案:

答案 0 :(得分:1)

所以我无法通过纯<log4net>-configuration来解决它。我想要实现的是最大可配置的appender,我不需要更改代码并重新编译更改。

但是,无论如何我都使用了代码来实现它。 也许它可以帮助别人。 看起来像这样:

public class FileAppender : IAppender
    {
        public void RegisterLogger(ILoggerRepository repository, IConfig config)
        {
            if (!config.isActive) return;
            if (repository.GetAppenders().Any(x => x.Name.Equals(config.logName, StringComparison.InvariantCultureIgnoreCase))) return;

            if (config.path.EndsWith(@"\") == false)
                path += @"\";

            var rollingFileAppender = new RollingFileAppender
            {
                Name = config.logName,
                AppendToFile = true,
                File = config.path,
                RollingStyle = RollingFileAppender.RollingMode.Date,
                StaticLogFileName = false,
                DatePattern = $"'{config.logName}_'yyyyMMdd'.log'",
                LockingModel = new log4net.Appender.FileAppender.MinimalLock(),
                Layout = new log4net.Layout.PatternLayout("%date %-5[%level] - %message%newline"),
            };

            var filters = new List<log4net.Filter.IFilter>() {
                new log4net.Filter.LoggerMatchFilter() { LoggerToMatch = config.logName, AcceptOnMatch = true },
                new log4net.Filter.DenyAllFilter(),
            };

            foreach (var filter in filters)
            {
                filter.ActivateOptions();
                rollingFileAppender.AddFilter(filter);
            }

            rollingFileAppender.ActivateOptions();
            log4net.Config.BasicConfigurator.Configure(rollingFileAppender);
        }

        public void Write(IConfig config, LogData data)
        {
            if (!config.isActive) return;
            var textLogger = LogManager.GetLogger(config.logName);
            var text = $"{data.Sender} - {data.Ip} - {data.Locator} - {data.Text} - {data.Args}";
            textLogger.Info(text);
        }
}