C# 使用log4net上下文属性对性能有负面影响吗?
发布这篇文章,看看是否有人有过类似的经历,是否有任何已知的解决方法 更新:log4net团队已确认这是一个问题,请参阅链接: 我发现,如果使用使用自定义属性的模式,日志记录速度将慢3-5倍。为了说明这一点,我设置了一个示例项目,使用2个不同的记录器和附加器记录10000次。其中1个具有自定义字符串属性 典型输出: 运行时间(无属性):800ms,运行时间(有属性)2400ms 使用上下文属性登录时速度慢三倍 在做了一些反编译之后,我认为只要输出一个参数,它就会在这个过程中触及当前用户名,这是一个昂贵的操作。我不确定,但我想事情就是这样 要复制它,请创建控制台应用程序并使用以下app.config和main.cs app.config:C# 使用log4net上下文属性对性能有负面影响吗?,c#,performance,logging,log4net,C#,Performance,Logging,Log4net,发布这篇文章,看看是否有人有过类似的经历,是否有任何已知的解决方法 更新:log4net团队已确认这是一个问题,请参阅链接: 我发现,如果使用使用自定义属性的模式,日志记录速度将慢3-5倍。为了说明这一点,我设置了一个示例项目,使用2个不同的记录器和附加器记录10000次。其中1个具有自定义字符串属性 典型输出: 运行时间(无属性):800ms,运行时间(有属性)2400ms 使用上下文属性登录时速度慢三倍 在做了一些反编译之后,我认为只要输出一个参数,它就会在这个过程中触及当前用户名,这是一个
<?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();
}
}
}
命名空间控制台应用程序11
{
班级计划
{
//private static readonly ILog log=LogManager.GetLogger(typeof(Program));
静态void Main(字符串[]参数)
{
//安排
log4net.Config.XmlConfigurator.Configure();
GlobalContext.Properties[“customProperty”]=“Test”;
var NRR请求=10000;
var noPropertyLogger=LogManager.GetLogger(“NoProperty”);
var propertyLogger=LogManager.GetLogger(“HasProperty”);
var noPropertyStopwatch=新秒表();
var propertyStopwatch=新秒表();
noPropertyStopwatch.Start();
对于(int i=0;i<10000;i++)
{
noPropertyLogger.Info(“不带自定义参数的日志记录”);
}
noPropertyStopwatch.Stop();
propertyStopwatch.Start();
for(int i=0;i