C# 使用log4net上下文属性对性能有负面影响吗?

C# 使用log4net上下文属性对性能有负面影响吗?,c#,performance,logging,log4net,C#,Performance,Logging,Log4net,发布这篇文章,看看是否有人有过类似的经历,是否有任何已知的解决方法 更新:log4net团队已确认这是一个问题,请参阅链接: 我发现,如果使用使用自定义属性的模式,日志记录速度将慢3-5倍。为了说明这一点,我设置了一个示例项目,使用2个不同的记录器和附加器记录10000次。其中1个具有自定义字符串属性 典型输出: 运行时间(无属性):800ms,运行时间(有属性)2400ms 使用上下文属性登录时速度慢三倍 在做了一些反编译之后,我认为只要输出一个参数,它就会在这个过程中触及当前用户名,这是一个

发布这篇文章,看看是否有人有过类似的经历,是否有任何已知的解决方法

更新:log4net团队已确认这是一个问题,请参阅链接:

我发现,如果使用使用自定义属性的模式,日志记录速度将慢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();
        }
    }
}
命名空间控制台应用程序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