【问题标题】:log4net using both BufferedAppender and RollingFileAppenderlog4net 同时使用 BufferedAppender 和 RollingFileAppender
【发布时间】:2018-02-06 15:47:37
【问题描述】:

我遇到的问题与此处以及 log4net 手册中已经讨论过的其他几个问题类似,但我需要更复杂的行为。

我想记录 Info、Warn 以及 Error 事件。 当我收到错误时,我还想“转储”最新的 50 个事件(调试、信息和警告) 我想将这两个日志写入同一个日志文件。

我知道使用 BufferedAppender 可能会出现“类似”的情况,但我尝试过,只有在出现错误时才得到转储,所以如果我没有收到任何错误,我会丢失所有 Info 和 Warn 事件(如果我降低BufferedAppender 的阈值我得到每个事件的所有日志)。

我想我需要创建一个 ForwardingAppender 和一个 BufferedAppender 都转发到同一个 RollingFileAppender,但我不知道如何正确地做到这一点。

Fx 2.0 的 1.2.10 版本是否可行?我需要这个来满足客户的要求...

此外,您能否在 XML .config 文件和 C# 编程配置中编写解决方案? 谢谢

【问题讨论】:

    标签: c# log4net log4net-appender


    【解决方案1】:

    经过2天的尝试,我终于找到了解决方案。

    (我是通过编程方式配置的,如果需要xml配置,不好意思你自己搞定)

        log4net.Appender.ForwardingAppender direct; // Global variable to enable threshold change
    
        public Form1()
        {
            InitializeComponent();
    
            // configuring Log4net
            log4net.Appender.RollingFileAppender roller = new log4net.Appender.RollingFileAppender();
            roller.AppendToFile = true;
            roller.File = "TestLog.log";
            roller.MaxSizeRollBackups = 10;
            roller.DatePattern = "yyyyMMdd";
            roller.Layout = new log4net.Layout.PatternLayout("%date  %-5level  - %message%newline%exception");
            roller.RollingStyle = log4net.Appender.RollingFileAppender.RollingMode.Date;
            roller.StaticLogFileName = true;
            roller.ActivateOptions();
            //log4net.Config.BasicConfigurator.Configure(roller); Do not activate logger, otherwise you will have all events twice
    
            direct = new log4net.Appender.ForwardingAppender();
            direct.Name = "direct";
            direct.Threshold = log4net.Core.Level.Warn;
            direct.AddAppender(roller);
            direct.ActivateOptions();
            log4net.Config.BasicConfigurator.Configure(direct);
    
            log4net.Appender.BufferingForwardingAppender buffer = new log4net.Appender.BufferingForwardingAppender();
            buffer.Name = "Buffer";
            buffer.BufferSize = 50;
            buffer.Lossy = true;
            buffer.Evaluator = new log4net.Core.LevelEvaluator(log4net.Core.Level.Error);
            buffer.AddAppender(roller);
            buffer.ActivateOptions();
            log4net.Config.BasicConfigurator.Configure(buffer);
        }
    
        private void numericUpDown1_ValueChanged(object sender, EventArgs e)
        {
            if (numericUpDown1.Value == 0)
                direct.Threshold = log4net.Core.Level.Debug;
            if (numericUpDown1.Value == 1)
                direct.Threshold = log4net.Core.Level.Info;
            if (numericUpDown1.Value == 2)
                direct.Threshold = log4net.Core.Level.Warn;
            if (numericUpDown1.Value == 3)
                direct.Threshold = log4net.Core.Level.Error;
        }
    

    如果你有更简洁的方法,请告诉我。

    我也无法登录不同的布局,也无法添加 "**** Dump start ****" 和 "**** Dump end ****" 由 BufferingForwardingAppender 完成的转储开始和结束。

    如果你知道怎么做,请告诉我。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-08
      • 2011-07-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多