2

Log4Net과 함께 로그 파일을 작성하기 위해 common.logging을 사용하여 Quartz.net으로 빌드 된 Windows 웹 서비스에 로깅을 추가하려고합니다.Quartz.net + Common.Logging을 사용하여 log4net 로그 파일을 작성하지 않았습니다.

내의 App.config은 다음과 같습니다

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

이 과정은 좋은 시작,하지만 더 로그 파일 :

<?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에() 이벤트를 일부 로그를 쓰기?

무엇이 누락 되었습니까?

답변

4

레벨을 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으로 사용하십시오.

UPDATE :

이러한 어셈블리 참조해야

당신의 프로젝트 : 1.2 버전 (

  1. Common.Logging.dll (버전 1.2.0.0.)
  2. Common.Logging.Log4Net.dll을 (

이 임) 1.2.10.0 버전 .0.2)

  • log4net.dll (석영 부분 제외) 귀하의 app.config : 나는 샘플 프로젝트 here (QuartzTestLog4Net.zip)을 업로드 한

    <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> 
    

    .
    이 프로젝트는 SourceForge에서 다운로드 한 solution에 추가 할 수 있습니다.
    공식 문서는 here입니다.

    <arg key="configType" value="INLINE" />을 사용하는 경우 Martinffx가 지적한 것처럼 factoryAdapter 섹션에서 레벨을 지정할 필요가 없습니다.이 경우 log4net은 설정 파일에있는 XML 구성을 사용하기 만합니다.

  • +0

    감사합니다. 또한 구성이 INLINE 인 경우 log4net 구성에서 레벨을 가져 오지 못합니까? – Martinffx

    +1

    @Martinffx : 샘플 코드를 사용해 보셨습니까? 그것은 작동해야합니다. 네가 옳아; configType 키의 INLINE 값인 Common.Logging은 구성 파일에있는 XML 구성을 단순히 사용하는 방식으로 log4net을 초기화합니다. – LeftyX

    +0

    비슷한 문제가 있었는데 ... 훌륭한 해결책!이것에 대해 많은 감사를드립니다! –

    0

    서비스를 관리자 권한으로 실행하지 않는 경우 권한 문제 일 수 있습니다.

    log.txt 파일을 만들 위치를 지정하지 않으므로 C : \ Windows \ System32와 같은 폴더에 파일을 만들려고 시도 할 수 있으며 해당 서비스에 대한 쓰기 권한이 없을 수 있습니다 폴더.

    +0

    이미 확인했습니다. 파일은 응용 프로그램의 기본 디렉토리에 작성됩니다. – LeftyX

    +0

    서버에 액세스 할 수있는 경우 Sysinternal의 DebugView를 실행하여 일부 오류를 지적 할 수 있습니다. Debugview에서 Capture Global Win32 출력을 활성화하고 webservice app.config의 appSettings 섹션에 '를 추가하여 내부 log4net 디버깅을 활성화해야 할 수도 있습니다. – sgmoore

    관련 문제