log4net日志文件未被Quartz.net + Common.Logging写入

3

我正在尝试使用common.logging将日志记录到log4net来为使用Quartz.net构建的Windows Web服务添加日志记录。

我的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);       
}

进程开始运行很好,但没有日志文件?

我漏掉了什么?

2个回答

5

您需要将级别添加到您的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(不包括quartz部分):
<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>

我已经上传了一个示例项目这里(QuartzTestLog4Net.zip)。
您可以将此项目添加到从SourceForge下载的解决方案中。
官方文档在这里
正如Martinffx指出的那样,如果您正在使用<arg key="configType" value="INLINE" />,则不需要在factoryAdapter部分中指定级别,因为在这种情况下,log4net将简单地使用也存在于配置文件中的XML配置。

谢谢,但还是没有任何东西。另外,如果配置是INLINE,它不会从log4net配置中获取级别吗? - Martinffx
1
@Martinffx:你试过我的示例代码了吗?它一定能工作。你是对的,对于configType键的INLINE值,Common.Logging将以一种方式初始化log4net,使其仅使用也存在于配置文件中的XML配置。 - LeftyX
有一个类似的问题... 解决方案很棒!非常感谢! - Hauns TM

0

如果您没有以管理员身份运行服务,则可能是权限问题。

由于您没有指定log.txt文件将被创建的位置,因此可能会尝试在类似C:\ Windows \ System32的文件夹中创建文件,而服务可能无法写入该文件夹。


我已经检查了。该文件已经创建在应用程序的基本目录中。 - LeftyX
如果您可以访问服务器,可以尝试运行Sysinternal的DebugView工具,它可能会定位一些错误。您可能需要在debugview中启用捕获全局Win32输出,并通过在webservice app.config的appSettings部分添加<add key="log4net.Internal.Debug" value="true"/>来启用内部log4net调试。 - sgmoore

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接