发布此消息,看看是否有人有类似的经历,是否有任何已知的解决方法?
更新:log4net小组已将此视为问题,请参阅链接:https://issues.apache.org/jira/browse/LOG4NET-429
我发现如果我使用的是使用自定义属性的模式,则日志记录将慢3-5倍。为了说明这一点,我设置了一个示例项目,使用2个不同的记录器和追加器记录10000次。其中1个具有自定义字符串属性。
典型输出:
经过时间(无属性):800ms,经过时间(有财产)2400ms
使用上下文属性进行日志记录时速度慢三倍
做了一些反编译之后我想一旦你输出一个参数,它最终会触及过程中的当前用户名,这是一个昂贵的操作。我不确定,但我认为这是怎么回事。
要重现它,请创建一个控制台应用程序并使用以下app.config和main.cs
的app.config:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</configSections>
<log4net>
<appender name="NoPropertyAppender" type="log4net.Appender.ConsoleAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%message%newline" />
</layout>
</appender>
<appender name="PropertyAppender" type="log4net.Appender.ConsoleAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%property{customProperty}- %message%newline" />
</layout>
</appender>
<logger name="NoProperty">
<level value="DEBUG" />
<appender-ref ref="NoPropertyAppender" />
</logger>
<logger name="HasProperty">
<level value="DEBUG" />
<appender-ref ref="PropertyAppender" />
</logger>
</log4net>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
</configuration>
Main.cs
namespace ConsoleApplication11
{
class Program
{
//private static readonly ILog log = LogManager.GetLogger(typeof(Program));
static void Main(string[] args)
{
// Arrange
log4net.Config.XmlConfigurator.Configure();
GlobalContext.Properties["customProperty"] = "Test";
var nrOfRepetitions = 10000;
var noPropertyLogger = LogManager.GetLogger("NoProperty");
var propertyLogger = LogManager.GetLogger("HasProperty");
var noPropertyStopwatch = new Stopwatch();
var propertyStopwatch = new Stopwatch();
noPropertyStopwatch.Start();
for (int i = 0; i < 10000; i++)
{
noPropertyLogger.Info("Logging without custom Parameter.");
}
noPropertyStopwatch.Stop();
propertyStopwatch.Start();
for (int i = 0; i < nrOfRepetitions; i++)
{
propertyLogger.Info("Logging with custom parameter");
}
propertyStopwatch.Stop();
noPropertyLogger.Info(string.Format("Elapsed time: (No property) {0}", noPropertyStopwatch.ElapsedMilliseconds));
propertyLogger.Info(string.Format("Elapsed time: (With property) {0}", propertyStopwatch.ElapsedMilliseconds));
Console.ReadLine();
}
}
}