Производительность Log4Net

Я записал приложение C#, которое постоянно работает в цикле, и несколько потоков пишут в log4net файл.

Проблема то, что, чем дольше приложение работает, тем больше времени требуется для завершения цикла. Я выполнил профилировщика Производительности МУРАВЬЕВ и заметил, что большая часть этого процессорного времени проведена, регистрируясь с log4.net.

Чем более подробный журналы, тем больше ЦП это использует и после 30 минут, это использует 100% ЦП. Если я отключаю вход времени, потраченного для цикла, остается постоянным со временем. Я взглянул на Windows Performance Monitor, и Физический диск большую часть времени НЕАКТИВЕН.

Я попытался свести свой вход к минимуму, но даже с относительно низкими объемами входа я все еще испытываю проблему.

Вот образец моего конфигурационного файла Log4net.xml:

<log4net>
  <root>
    <!-- Levels: OFF, DEBUG, INFO, WARN, ERROR, FATAL-->
    <level value="INFO" />
    <appender-ref ref="RollingLogFileAppender" />
  </root>

  <!--Logs to a file-->
  <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
    <file value="c:\\logs\\log-file.txt" />
    <appendToFile value="true" />
    <lockingModel type="log4net.Appender.FileAppender+ExclusiveLock" />
    <rollingStyle value="Composite" />
    <datePattern value="yyyyMMdd" />
    <maxSizeRollBackups value="20" />
    <maximumFileSize value="1MB" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date [%thread] %-5level %logger %L %M Schdl:[%property{scheduleContext}] Job:[%property{jobContext}] - %message%newline" />
    </layout>
  </appender>
</log4net>

Я использую тот же регистратор от каждого объекта, который регистрируется.

  log4net.ILog logger;
  log4net.Config.BasicConfigurator.Configure();
  logger = log4net.LogManager.GetLogger(typeof(myProject));

Почему это использовало бы все больше ЦП дольше, это работает?

Любой консультирует по вопросам того, как улучшиться, это ценилось бы.

16
задан Philipp M 5 November 2013 в 10:33
поделиться

3 ответа

Вы настраиваете log4net в каждом объекте, который ведет логи? Судя по вашему коду, похоже на то. Конфигурация должна быть выполнена один раз для каждого процесса, например, при запуске, а затем ваши объекты должны только получить регистратор.

Для каждого класса, которому нужно вести журнал, я обычно использую следующий шаблон:

class SomeClass
{
    private static readonly ILog log = LogManager.GetLogger(typeof(SomeClass));
    ...
}

Используя этот шаблон, вы автоматически получите регистраторы, которые иерархически расположены в соответствии с пространством имен и именем класса.

32
ответ дан 30 November 2019 в 17:15
поделиться

Что вы делаете с этими свойствами контекста? Schdl: [% property {scheduleContext}] Job: [% property {jobContext}] Если вы назначаете здесь что-то большее, чем просто значение (или объект с простым методом ToString ()), он может заболеть вниз производительность. См. Руководство log4net в разделе Значения активного свойства , чтобы понять, о чем я говорю.

Питер Лиллевольд дает хорошее предложение настроить log4net только один раз. Вы также можете поместить следующую строку в свой файл AssemblyInfo.cs:

[assembly: log4net.Config.XmlConfigurator()]

Следующую строку легко вырезать и вставить в любой класс, который ведет журнал:

private static readonly log4net.ILog _log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

Вы также можете попробовать включить внутреннее ведение журнала log4net, чтобы увидеть, что происходит :

<appSettings>
  <add key="log4net.Internal.Debug" value="true"/>
</appSettings>
4
ответ дан 30 November 2019 в 17:15
поделиться

(я никогда раньше не использовал log4net, поэтому с осторожностью принимайте то, что я рекомендую)

Вы можете написать асинхронный прокси для компонента log4Net и войти в специальный поток. Вы больше не будете блокировать свои основные потоки попытками записи в файл журнала.

Все это бесполезно, если у log4net уже есть асинхронный прокси.

-3
ответ дан 30 November 2019 в 17:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: