当前位置: 首页 > 知识库问答 >
问题:

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

史修明
2023-03-14

我正在使用web中的配置设置upp Log4Net。配置并希望基于数据中的属性并结合今天的日期创建文本日志<code>(RollingLogFileAppender)。(这在早期的代码中是可以实现的,但有点难看,所以将所有内容都移动到web.config):

类似这样的BOOKINGS_20160405.txt

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

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

这甚至可以在不为其编写一些代码的情况下实现吗?也许我根本不应该为此使用RollingLogFileAppender?

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

共有1个答案

干稳
2023-03-14

所以我无法通过纯来解决它

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

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);
        }
}

 类似资料:
  • 问题内容: 我已经编写了一些代码来检查两个日期,即开始日期和结束日期。如果结束日期早于开始日期,则会提示您结束日期早于开始日期。 我还想添加检查开始日期是否在今天之前(今天和用户使用该应用程序的那天一样)。(下面的日期检查器代码,如果有任何影响,那么所有这些都为Android编写) 问题答案: 这有帮助吗?

  • 获取今天的日期(年、月、日) 用法 Your browser does not support the video tag. 案例:小闹钟 功能:2019年12月25日,播放圣诞快乐歌

  • 问题内容: 我有此查询以获取月结果。但是我想得到今天的结果。 做这个的最好方式是什么? 问题答案: 您的开始日期对象应将当前日期时间设置为(毫秒精度),并将今天的时间设置为: 然后像往常一样在您的MongoDB查询运算符中传递修改后的日期对象: 如果您正在使用 momentjs 库,则可以通过在当前当前日期对象上使用 and 方法,并将字符串作为参数传递来实现:

  • 我不确定这是否可能? 我得拿到密码才能读 今天的月份即2月今天的日期即17月底的日期即31日,然后是一年中的其他11个月,在一行中按顺序排列 8月1日-31日|9月|10月|11月|12月|1月|2月|3月|4月|5月|6月|7月 请以最佳方式提供任何建议? 多谢 定时(timing的缩写)

  • 问题内容: 换句话说,我想要提供Joda-Time的功能: 但没有Joda-Time,只有java.util.Date。 不推荐使用.setHours()等方法。有没有更正确的方法? 问题答案: 由于不推荐使用这些方法,因此您可以使用: 如果最终需要一个对象,只需调用