簡體   English   中英

使用BufferedAppender和RollingFileAppender的log4net

[英]log4net using both BufferedAppender and RollingFileAppender

我有一個問題,與這里已經討論過的其他幾個問題以及在log4net手冊上都有類似的問題,但是我需要更復雜的行為。

我想記錄“信息”,“警告”以及“錯誤”事件。 當我收到錯誤消息時,我也想“轉儲”最近的50個事件(調試,信息和警告),我想將這兩個日志都寫入同一日志文件中。

我知道BufferedAppender可能會發生“相似”的情況,但我嘗試過,並且只有在出現錯誤時才進行轉儲,因此,如果我沒有收到任何錯誤(如果我降低BufferedAppender的閾值,則將丟失所有Info和Warn事件)每個事件我都會獲得所有日志)。

我想我需要創建一個ForwardingAppender和BufferedAppender,它們都轉發到同一個RollingFileAppender,但是我不知道如何正確地做到這一點。

Fx 2.0的versione 1.2.10是否可能? 我需要這個來滿足客戶要求...

此外,您能否同時在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 ****”。

如果您知道該怎么做,請告訴我。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM