log4net 同时使用 BufferedAppender 和 RollingFileAppender

log4net using both BufferedAppender and RollingFileAppender

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

我想记录信息、警告和错误事件。 当我遇到错误时,我还想 "dump" 最近的 50 个事件(调试、信息和警告) 我想将这两个日志写入同一个日志文件。

我知道 BufferedAppender 可以做到 "similar",但我试过了,但只有在出现错误时才得到转储,所以如果我没有收到任何错误,我会丢失所有信息和警告事件 (如果我降低 BufferedAppender 的阈值,我会在每个事件中获取所有日志)。

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

1.2.10 版本可以用于 Fx 2.0 吗?我需要这个来满足客户的要求...

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

经过 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;
    }

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

我也无法登录不同的布局,也无法添加 在 BufferingForwardingAppender 完成的转储的开始和结束处出现“**** Dump start ****”和“**** Dump end ****”。

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