【问题标题】:log4net log file not been written using Quartz.net + Common.Logging未使用 Quartz.net + Common.Logging 写入 log4net 日志文件
【发布时间】:2012-02-28 12:30:49
【问题描述】:

我正在尝试将日志记录添加到使用 Quartz.net 构建的 Windows Web 服务中,使用 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);       
}

进程启动正常,但没有日志文件?

我错过了什么?

【问题讨论】:

    标签: log4net quartz.net log4net-configuration common.logging


    【解决方案1】:

    您必须将级别添加到您的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 版。

    您将其用作sample 和其他一些信息here

    更新

    您的项目必须引用这些程序集:

    1. Common.Logging.dll(1.2.0.0 版)
    2. Common.Logging.Log4Net.dll (ver 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>
    

    我已经上传了一个示例项目here (QuartzTestLog4Net.zip)。
    您可以将此项目添加到从 SourceForge 下载的solution
    官方文档是here

    正如 Martinffx 所指出的,如果您使用 &lt;arg key="configType" value="INLINE" /&gt;,则无需在 factoryAdapter 部分中指定级别,因为在这种情况下,log4net 将简单地使用您的配置文件中也存在的 XML 配置.

    【讨论】:

    • 谢谢,但还是没有。此外,如果配置是内联的,它不会从 log4net 配置中获取级别吗?
    • @Martinffx:你试过我的示例代码了吗?它必须工作。你说得对; configType 键的 INLINE 值,Common.Logging 只会以一种简单的方式初始化 log4net,它只会使用您的配置文件中也存在的 XML 配置。
    • 遇到了类似的问题...很好的解决方案!非常感谢!
    【解决方案2】:

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

    由于您没有指定 log.txt 文件的创建位置,它可能会尝试在 C:\Windows\System32 等文件夹中创建文件,并且该服务可能没有对该文件夹的写入权限.

    【讨论】:

    • 我已经检查过了。该文件是在应用程序的基目录中创建的。
    • 如果您可以访问服务器,您可以尝试运行 Sysinternal 的 DebugView,这可能会查明一些错误。您可能需要在 debugview 中启用 Capture Global Win32 输出,并通过将 &lt;add key="log4net.Internal.Debug" value="true"/&gt; 添加到 webservice app.config 的 appSettings 部分来启用内部 log4net 调试
    猜你喜欢
    • 2011-01-15
    • 2016-03-28
    • 2016-05-08
    • 2012-11-11
    • 1970-01-01
    • 1970-01-01
    • 2015-01-17
    • 1970-01-01
    • 2023-03-31
    相关资源
    最近更新 更多