2016-11-03 2 views
2

log4net을 사용하는 WPF 앱이 있습니다. Visual Studio에서 실행할 때 로그 파일은 Debug 또는 Release 폴더에 예상대로 만들어집니다.앱을 배포 할 때 log4net 로그 파일이 작성되지 않습니다.

그러나 설치 프로그램을 만들고 설치된 응용 프로그램을 실행하면 로그 파일이 만들어지지 않습니다. 코드에 다음 줄을 추가했습니다 ...

string logFilePath = ((Hierarchy)LogManager.GetRepository()) 
       .Root.Appenders.OfType<FileAppender>() 
       .FirstOrDefault()?.File; 
    using (StreamWriter sw = new StreamWriter(@"d:\log.log")) { 
    sw.WriteLine("Log file: " + logFilePath); 
    } 

... 내가 예상 한 위치에 로그 파일이 기록되고 있는지 확인할 수 있습니다. 로그 파일이 내가 예상했던대로 C:\Program Files (x86)\Physio Diary\PhysioDiaryClient.log에 기록되어 있다고 알려졌습니다.

그러나 파일이 없습니다. 왜 그런가? 여기

사이에

<?xml version="1.0" 
     encoding="utf-8"?> 

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

    <log4net> 
    <appender name="RollingFileAppender" 
       type="log4net.Appender.RollingFileAppender"> 
     <param name="File" 
      value="PhysioDiaryClient.log" /> 
     <appendToFile value="true" /> 
     <rollingStyle value="Size" /> 
     <maxSizeRollBackups value="2" /> 
     <maximumFileSize value="1MB" /> 
     <staticLogFileName value="true" /> 
     <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%date [%thread] %-7level %logger - %message%newline%exception" /> 
     </layout> 
    </appender> 
    <root> 
     <level value="DEBUG" /> 
     <appender-ref ref="RollingFileAppender" /> 
    </root> 
    </log4net> 

파일의 바닥과 같다 ...

<startup> 
    <supportedRuntime version="v4.0" 
         sku=".NETFramework,Version=v4.5.2" /> 
    </startup> 

</configuration> 

비트가 모두 수행한다 .. app.config 파일의 선두입니다 앱이 사용하는 WCF 서비스와

누구나 아이디어가 있으십니까?

편집 : 테스트로서, 나는 내 D에 대한 App.config에서 로그 파일 경로를 하드 코딩 시도 : 드라이브 (이 하드 코딩 없습니다 및 권한 문제의 의심 때문에)하지만 파일 여전히 만들어지지 않았습니다.

+2

일반적으로 말하는 응용 프로그램이 해당 디렉토리에 쓸 수 없기 때문에 % ProgramFiles % 디렉토리를 로깅 대상으로 구성하면 안됩니다. – dymanoid

+1

@dymanoid 이상적으로, 사용자의 로컬 폴더에있는 고객 폴더에 로그 파일을 작성하고 싶습니다. 내가 어떻게 그걸 할 수 있겠 어? 비록 내가 확실히 권한이있는 D : 드라이브에 대한 경로를 하드 코딩하더라도 파일이 작성되지 않기 때문에 이것이 대답인지 확신 할 수 없습니다. 그래도 위치를 먼저 고정하고 도움이되는지 확인하는 것이 좋습니다. 감사 –

답변

4

@dymanoid 덕분에 올바른 방향으로 나를 가리키게되었습니다. log4net 문서는이 영역에서 약간 약하긴하지만 설정 파일에서 일반적인 환경 변수를 사용할 수 있다고 지적한 this answer을 발견했습니다. 이 list of environment variables의 도움으로

, 나는
<param name="File" 
     value="${LOCALAPPDATA}\Physio Diary\PhysioDiaryClient.log" /> 

이 제대로이 사람을 도움이 C:\Users\MyUsername\AppData\Local\Physio Diary\PhysioDiaryClient.log

희망에 파일을 쓰기 다음으로 돌아가 셨습니다.

관련 문제