自最小锁设置以来,Log4net多次记录同一行

自最小锁设置以来,Log4net多次记录同一行,log4net,log4net-configuration,log4net-appender,Log4net,Log4net Configuration,Log4net Appender,我最近不得不在我的C#程序中面对一些性能问题,并发现log4net是这些问题的根源。我更改了配置,添加了MinimalLock,这真的帮了大忙 这就是我现在配置log4net的方式: var hierarchy = (Hierarchy)log4net.LogManager.GetRepository(); var patternLayout = new PatternLayout(); patternLayout.ConversionPattern = "%date [%thread] %-

我最近不得不在我的C#程序中面对一些性能问题,并发现
log4net
是这些问题的根源。我更改了配置,添加了
MinimalLock
,这真的帮了大忙

这就是我现在配置log4net的方式:

var hierarchy = (Hierarchy)log4net.LogManager.GetRepository();

var patternLayout = new PatternLayout();
patternLayout.ConversionPattern = "%date [%thread] %-5level %logger - %message%newline";
patternLayout.ActivateOptions();

var roller = new RollingFileAppender();

roller.LockingModel = new FileAppender.MinimalLock();
roller.LockingModel.ActivateOptions();

roller.Encoding = System.Text.Encoding.UTF8;
roller.AppendToFile = true;
roller.File = Path.Combine(Logger.LogPath, "log.txt");
roller.Layout = patternLayout;
roller.MaxSizeRollBackups = 5;
roller.MaximumFileSize = "100MB";
roller.RollingStyle = RollingFileAppender.RollingMode.Size;
roller.StaticLogFileName = true;
roller.ActivateOptions();

hierarchy.Root.AddAppender(roller);
hierarchy.Root.Level = Level.Debug;
hierarchy.Configured = true;
这样做的缺点是,现在我的日志包含重复多次的非常相同的日志行

我怀疑我误解了log4net配置中的某些内容,现在我想要输出的每个日志行的发送次数与应用程序的进程相同(甚至,很明显,创建的其余进程没有记录任何内容,或者至少没有同时记录同一行!)

以下是日志行的示例:

2016-11-18 10:35:34495[1]调试MetryViewModel-读取dat:manuel.dat,配置:无 2016-11-18 10:35:34495[1]调试MetryViewModel-读取dat:manuel.dat,配置:无 2016-11-18 10:35:34495[1]调试MetryViewModel-读取dat:manuel.dat,配置:无 2016-11-18 10:35:34495[1]调试MetryViewModel-读取dat:manuel.dat,配置:无 2016-11-18 10:35:34495[1]调试MetryViewModel-读取dat:manuel.dat,配置:无 2016-11-18 10:35:34495[1]调试MetryViewModel-读取dat:manuel.dat,配置:无 2016-11-18 10:35:34495[1]调试MetryViewModel-读取dat:manuel.dat,配置:无 2016-11-18 10:35:34495[1]调试MetryViewModel-读取dat:manuel.dat,配置:无 2016-11-18 10:35:34495[1]调试MetryViewModel-读取dat:manuel.dat,配置:无 2016-11-18 10:35:34495[1]调试MetryViewModel-读取dat:manuel.dat,配置:无 2016-11-18 10:35:34495[1]调试MetryViewModel-读取dat:manuel.dat,配置:无 2016-11-18 10:35:34495[1]调试MetryViewModel-读取dat:manuel.dat,配置:无 2016-11-18 10:35:34495[1]调试MetryViewModel-读取dat:manuel.dat,配置:无 2016-11-18 10:35:34495[1]调试MetryViewModel-读取dat:manuel.dat,配置:无 2016-11-18 10:35:34495[1]调试MetryViewModel-读取dat:manuel.dat,配置:无 2016-11-18 10:35:34495[1]调试MetryViewModel-读取dat:manuel.dat,配置:无 2016-11-18 10:35:34512[1]信息视图模型-操作模式:Lol
2016-11-18 10:35:34512[1]信息视图模型-操作模式:Lol
2016-11-18 10:35:34512[1]信息视图模型-操作模式:Lol
2016-11-18 10:35:34512[1]信息视图模型-操作模式:Lol
2016-11-18 10:35:34512[1]信息视图模型-操作模式:Lol
2016-11-18 10:35:34512[1]信息视图模型-操作模式:Lol
2016-11-18 10:35:34512[1]信息视图模型-操作模式:Lol
2016-11-18 10:35:34512[1]信息视图模型-操作模式:Lol
2016-11-18 10:35:34512[1]信息视图模型-操作模式:Lol
2016-11-18 10:35:34512[1]信息视图模型-操作模式:Lol
2016-11-18 10:35:34512[1]信息视图模型-操作模式:Lol
2016-11-18 10:35:34512[1]信息视图模型-操作模式:Lol
2016-11-18 10:35:34512[1]信息视图模型-操作模式:Lol
2016-11-18 10:35:34512[1]信息视图模型-操作模式:Lol
2016-11-18 10:35:34512[1]信息视图模型-操作模式:Lol
2016-11-18 10:35:34512[1]信息视图模型-操作模式:Lol

在您的情况下:
如果所有消息都在同一时间和同一线程上,则您的某个组件可能正在添加跟踪侦听器。 检查
System.Diagnostics.Trace.Listeners
属性。
在我的例子中,是Owin服务器在启动时添加了它们:

对于其他人:
消除由多个附加器引起的可能性。
您可以使用
LogManager.GetRepository().GetAppenders().Length
请记住,记录器将继承根记录器的附加程序

确保您的代码只调用一次 (您可以通过在对话模式中添加[%thread]来打印线程id

<layout type="log4net.Layout.PatternLayout">
    <param name="ConversionPattern" value="%date [%thread] %message%newline" />
  </layout>


您是否多次运行上述代码?您所说的应用程序的进程数是什么意思?我只运行了一次代码。应用程序的进程数是多少,我的意思是应用程序正在创建多个进程,这可能是有关联的吗?没有意义。要获得多个条目,请你要么需要添加几个记录器,要么多次记录事件。如果是后者,事件将在不需要MininalLock的情况下显示,时间戳也会不同,因此看起来你要多次初始化log4net。为了排除这种情况,你能试着记录一些东西吗(可能
LogManager.GetRepository()).GetAppenders().Length
)调用
hierarchy.Configured=true;
并查看此消息是否立即添加多次,或者是否添加一次、两次、三次,等等。问题可能是这样的。您正在多个线程中调用日志语句。如果未激活MinimalLock,则第一个正在写入的线程对文件的访问是锁定的。因此所有其他线程都无法写入该文件。一旦激活了MinimalLock,Appender就会锁定该文件并再次释放。因此,现在每个线程都可以写入该文件。对我来说,它正在打印同一个线程,因此该函数只被调用一次,我只有一个Appender,但日志行是相同的ng登录了好几次,你知道为什么吗?请注意,我使用的是.NETCore