使用log4net Context Properties会对性能产生负面影响吗?

时间:2014-03-24 14:29:34

标签: c# performance logging log4net

发布此消息,看看是否有人有类似的经历,是否有任何已知的解决方法?

更新: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();
        }
    }
}

0 个答案:

没有答案