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 ****”。
如果你知道怎么做,请告诉我。
我遇到的问题与此处以及 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 ****”。
如果你知道怎么做,请告诉我。