2016-11-03 3 views
2

У меня есть приложение WPF, которое использует log4net. Когда я запускаю его в 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, что и я ожидал.

Однако файл не существует. Любая идея почему?

Вот верх файла App.config ...

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

Биты между все делать с услугами WCF, которые использует приложение.

У вас есть идеи?

Edit: В качестве теста я пытался жестким кодированием пути к файлу войти App.config к моему D: диск (так что это жестко, и речи о проблеме прав доступа), но файл еще не было создано.

+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

Надеется, что это поможет кому-то.

Смежные вопросы