Файл журнала log4net был записан не с использованием Quartz.net + Common.Logging

Я пытаюсь добавить ведение журнала в свою веб-службу Windows, созданную с помощью Quartz.net, используя common.logging для записи файла журнала с помощью log4net.

Мой App.config выглядит так:

<?xml version="1.0"?>
<configuration>
  <configSections>
    <sectionGroup name="common">
      <section name="logging" type="Common.Logging.ConfigurationSectionHandler, Common.Logging"/>
    </sectionGroup>     
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
    <section name="quartz" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0,Culture=neutral, PublicKeyToken=b77a5c561934e089" />
  </configSections>
  <quartz>
    <add key="quartz.scheduler.instanceName" value="CommerceScheduler" />
    <add key="quartz.threadPool.type" value="Quartz.Simpl.SimpleThreadPool, Quartz" />
    <add key="quartz.threadPool.threadCount" value="10" />
    <add key="quartz.threadPool.threadPriority" value="Normal" />
  </quartz>
  <appSettings>
    <add key="configpath" value="C:\Projects\SiteScheduler\SiteScheduler\Schedule.xml"/>
  </appSettings>
  <common>
    <logging>
      <factoryAdapter type="Common.Logging.Log4Net.Log4NetLoggerFactoryAdapter, Common.Logging.Log4net">
        <arg key="configType" value="INLINE" />
      </factoryAdapter>
    </logging>
  </common>
  <log4net>
    <root>
      <level value="DEBUG" />
      <appender-ref ref="LogFileAppender" />
    </root>
    <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender" >
      <param name="File" value="log.txt" />
      <param name="AppendToFile" value="true" />
      <rollingStyle value="Size" />
      <maxSizeRollBackups value="10" />
      <maximumFileSize value="10MB" />
      <staticLogFileName value="true" />
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%-5p%d{yyyy-MM-dd hh:mm:ss} – %m%n" />
      </layout>
    </appender>
</log4net>
    <runtime>
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <dependentAssembly>
        <assemblyIdentity name="Common.Logging" publicKeyToken="af08829b84f0328e" culture="neutral"/>
        <bindingRedirect oldVersion="0.0.0.0-2.0.0.0" newVersion="2.0.0.0"/>
      </dependentAssembly>
    </assemblyBinding>
   </runtime>
   <startup>
     <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
  </startup>
</configuration>

Затем я пишу несколько журналов о событии onStart ():

protected override void OnStart(string[] args)
{    
    var log = LogManager.GetCurrentClassLogger();

    // construct a scheduler factory
    ISchedulerFactory schedFact = new StdSchedulerFactory();

    // get a scheduler
    var sched = schedFact.GetScheduler();
    sched.Start();

    log.Debug(m => m("Scheduler started"));  
    log.Debug(m => m("Load Schedules"));
    ProcessLogs("Scheduler started");
    LoadSchedules(sched);       
}

Процесс запускается нормально, но файлов журналов нет?

Что мне не хватает?


person Martinffx    schedule 28.02.2012    source источник


Ответы (2)


Вы должны добавить уровни в свой factoryAdapter.

<common>
  <logging>
    <factoryAdapter type="Common.Logging.Log4Net.Log4NetLoggerFactoryAdapter, Common.Logging.Log4net">
      <arg key="configType" value="INLINE" />
    </factoryAdapter>
  </logging>
</common>

и убедитесь, что вы используете правильную версию Common.Logging. Quartz.net 1.0.3 использует Common.Logging версии 1.2.

Вы используете это как образец и другую информацию здесь.

ОБНОВЛЕНИЕ:

Ваш проект должен ссылаться на эти сборки:

  1. Common.Logging.dll (версия 1.2.0.0)
  2. Common.Logging.Log4Net.dll (версия 1.2.0.2)
  3. log4net.dll (версия 1.2.10.0)

и это ваш app.config (без секции кварца):

<configSections>
  <section name="quartz" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0,Culture=neutral, PublicKeyToken=b77a5c561934e089" />
  <sectionGroup name="common">
    <section name="logging" type="Common.Logging.ConfigurationSectionHandler, Common.Logging" />
  </sectionGroup>
  <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</configSections>

<common>
    <logging>
      <factoryAdapter type="Common.Logging.Log4Net.Log4NetLoggerFactoryAdapter, Common.Logging.Log4Net">
        <arg key="configType" value="INLINE"/>
      </factoryAdapter>
    </logging>
</common>

<log4net>
    <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender" >
      <param name="File" value="MyQuartzLog.txt" />
      <param name="AppendToFile" value="true" />
      <rollingStyle value="Size" />
      <maxSizeRollBackups value="10" />
      <maximumFileSize value="10MB" />
      <staticLogFileName value="true" />
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%-5p%d{yyyy-MM-dd hh:mm:ss} – %m%n" />
      </layout>
    </appender>
    <root>
      <level value="DEBUG" />
      <appender-ref ref="LogFileAppender" />
    </root>
</log4net>

Я загрузил образец проекта , вам не нужно указывать уровни в разделе factoryAdapter, потому что в этой ситуации log4net просто будет использовать конфигурацию XML, которая также присутствует в вашем файле конфигурации.

person LeftyX    schedule 28.02.2012
comment
Спасибо, но все равно ничего. Также, если конфигурация ВНУТРЕННЯЯ, разве она не получает уровни из конфигурации log4net? - person Martinffx; 29.02.2012
comment
@Martinffx: вы пробовали мой пример кода? Это должно сработать. Ты прав; INLINE для ключа configType, Common.Logging просто инициализирует log4net таким образом, чтобы просто использовать конфигурацию XML, которая также присутствует в вашем файле конфигурации. - person LeftyX; 01.03.2012
comment
Была аналогичная проблема ... Отличное решение! Большое спасибо за это! - person Hauns TM; 31.10.2012

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

Поскольку вы не указываете, где будет создан файл log.txt, возможно, что он пытается создать файл в такой папке, как C: \ Windows \ System32, и служба может не иметь доступа на запись в эту папку.

person sgmoore    schedule 29.02.2012
comment
Я это уже проверил. файл создается в базовом каталоге приложения. - person LeftyX; 29.02.2012
comment
Если у вас есть доступ к серверу, вы можете попробовать запустить DebugView Sysinternal, который может выявить некоторую ошибку. Возможно, вам потребуется включить вывод Capture Global Win32 в debugview, а также включить внутреннюю отладку log4net, добавив <add key="log4net.Internal.Debug" value="true"/> в раздел appSettings вашего веб-сервиса app.config - person sgmoore; 29.02.2012