2011-08-02 2 views
3

Windows 서비스에서 log4net을 실행하고 싶습니다. 그리고 그것은 단순히 불가능합니다.Log4net 및 Windows 서비스. 이 작업을 위해 무엇을해야합니까?

먼저 Win 형태로 작업하십시오. 여기

내가 Windows 서비스와 함께 할 것입니다 :

어셈블리에 추가

[assembly: log4net.Config.XmlConfigurator(Watch = true)] 

내 설정 :

<configSections> 
    <section name="log4net" 
     type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /> 
    </configSections> 

    <log4net> 
    <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender"> 
     <param name="File" value="log-file.txt" /> 
     <param name="AppendToFile" value="true" /> 
     <layout type="log4net.Layout.PatternLayout"> 
     <param name="ConversionPattern" value="%d [%t] %-5p %c: %m%n" /> 
     </layout> 
    </appender> 
    <root> 
     <level value="ALL" /> 
     <appender-ref ref="LogFileAppender" /> 
    </root> 
    </log4net> 

내 클래스 :

public class LogProvider 
{ 
    private ILog _Log; 


    public LogProvider(string className) 
    { 
     XmlConfigurator.Configure(); 
     _Log = LogManager.GetLogger(className); 
    } 

    public void Info(object message) 
    { 
     _Log.Info(message); 
    } 
} 

과의 주 프로그램 :

using log4net; 
using log4net.Config; 

(...) 

private LogProvider _logProvider; 

(...) 

       _logProvider = new LogProvider("Test"); 
       _logProvider.Info("asds"); 

향후 진행될 작업은 무엇입니까?

위의 코드는 약 100 버전 이상이므로 샘플 프로젝트를 보여주십시오. 나는 이것이 Windows 서비스를 사용하는 log4net을 사용하는 것이 불가능하다고 믿기 시작합니다.


UPDATE :

그래서, 권한에 대한 : 는 사실은 내가 사용 권한에 대한 예외를 얻을. 나는이 줄 (requirePermission = "false")으로 이것을 고친다. :

<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" requirePermission="false"/> 

이제는 예외없이 예외가있다.

이 내 마지막 간부 코드 :

protected override void OnStart(string[] args) 
{ 
    try 
    { 

     LogProvider lp = new LogProvider("asd"); 
     lp.Info("asd2"); 
    } 
    catch (Exception ex) 
    { 
     System.IO.FileInfo _file; 
     System.IO.StreamWriter _writer; 
     _file = new System.IO.FileInfo("D:\\Log\\asdCatch.txt"); 
     _writer = _file.CreateText(); 
     _writer.WriteLine("[" + DateTime.Now.ToString() + "] Init Log"); 
     _writer.WriteLine("[" + DateTime.Now.ToString() + "] " + ex.ToString()); 
     _writer.Close(); 

    } 
} 

지금 내가 정말 혼란스러워하고있어, 내가 다른 Windows 서비스를 만들었하고 일하고있어 - 권한이 그 선없이. 세상에, 이상 하네.


업데이트 2 : 확인해 봤습니다. 이런 일이 어떻게했는지는 모르겠지만, 나는 나의의 app.config에서 그 라인을 발견 :

<runtime> 
    <NetFx40_LegacySecurityPolicy enabled="true"/> 
    </runtime> 

I 15 - 하위 프로젝트 프로그램에서 일하고 있어요 그것이 어디에서 왔는지 진지하게, 나도 몰라를 :/

+0

당신은 무엇을 관찰 할 수 있습니까? 던져지는 예외가 있습니까? 또는 단순히 예상 한 결과를 산출하지 못합니까? –

+0

시작시 "asds"를 로깅해야합니다. 새 파일이 없습니다. 나는 C : \\ i D : \\ {tmp}에서 내 dir 앱에서 직접 시도했습니다. – Marshall

+0

그러면 크래시 또는 예외가 발생하지 않습니다. procmon (SysInternals 도구)을 사용하여 Windows 서비스를 보았습니까? 모든 파일 시스템 액세스를 보여줍니다. –

답변

6

우리는 문제가 있었다. 따라서 log4net.config가 시스템 디렉토리에 있어야합니다.이 디렉토리는 바람직하지 않거나 log4net.config 파일의 경로를 제공해야합니다.

+0

이것은 나에게도 마찬가지였다. 방금 log4net 구성을 app.config 파일과 병합했습니다. – maulik13

4

Windows 응용 프로그램에서이 로깅이 작동하는 경우 대부분 사용 권한 문제입니다. Windows 서비스에 로그인 할 때 Windows 서비스가 실행되는 사용자는 로그온하려는 폴더에 대한 쓰기 권한이 있어야합니다.

또한 log4net 디버깅을 사용하여 이것이 도움이되는지 확인해야합니다.추가 질문이있는 경우

<log4net debug="true"> 

    ... configuration ... 

</log4net> 

는 또한이 매우 유사한 게시물에 내 대답에 보일 것입니다 : 서비스 런타임 디렉토리 C:\Windows\System 또는 C:\Windows\System32 때문에

log4net doesn't create log file when deployed on IIS7

+0

그러나 승리 양식에서 - 좋은 일. C#에서 권한을 설정하는 방법? – Marshall

+0

Cole은 Windows 서비스가 실행중인 계정에 로그온 할 때마다 폴더에 쓸 수있는 권한이 없음을 의미합니다. 따라서 해당 폴더가 C : \ MyLogs 인 경우 Windows 서비스가 실행되는 사용자는 해당 폴더에 대한 쓰기 권한이 있어야합니다. 서비스가 실행중인 사용자의 Windows 서비스에서 C# 코드를 통해 폴더에 대한 사용 권한을 부여 할 수 없습니다. 서비스가 로그를 쓰려고 시도하기 전에 권한이없는 경우 로그되지 않습니다. – ElvisLives

+0

우수 답변! 나는 debug = "true"를 넣었고 나의 설정이 정확히 무엇이 잘못되었는지 보았다. – neustart47

2

log4net + windows 서비스로 성공했지만 log4net 내부 디버깅을 사용할 수 있습니다 (http://log4net.sourceforge.net/release/1.2.0.30316/doc/manual/faq.html#internalDebug). 가능한 모든 잘못

이이 시도해 볼 수 콘솔 모드에서 서비스를 실행

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "app.config", Watch = true)]