2016-07-27 4 views
2

Я использую log4net в приложении WPF. log4net работает при запуске приложения из Visual Studio, однако он не работает, когда мы запускаем приложение через исполняемый файл от bin.log4net не работает при выполнении исполняемого файла WPF

Мы используем log4net.config файл, вот как это выглядит:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <log4net debug="true"> 
    <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender"> 
     <param name="File" value="C:/ProgramData/CompApps/Logs/AppName/log.txt" /> 
     <appendToFile value="true" /> 
     <rollingStyle value="Size" /> 
     <maxSizeRollBackups value="25" /> 
     <maximumFileSize value="20MB" /> 
     <staticLogFileName value="true" /> 
     <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%utcdate UTC %property{log4net:HostName} [%thread] %-5level %logger - %method() - %message%newline" /> 
     </layout> 
    </appender> 
    <root> 
     <level value="Info" /> 
     <appender-ref ref="RollingFileAppender" /> 
    </root> 
    </log4net> 
</configuration> 

log4net.config свойства

Build Action: Content 
Copy to Output Directory: Copy always 

AssemblyInfo.cs:

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

И это используется в каждом классе мы хотим использовать регистратор:

private static readonly ILog log = LogManager.GetLogger(typeof(App)); 
+1

Имеет ли пользователь ** ** при запуске приложения права записи на 'C:/ProgramData/CompApps/Logs/AppName /'? – ChrisF

+0

Да, пользователь, выполняющий приложение, имеет права на запись в 'C:/ProgramData/CompApps/Logs/AppName /' – Cole

+0

Делает ли 'debug =" true "' какой-либо смысл не регистрироваться при выполнении из .exe? –

ответ

1

Другой подход к конфигурации в коде:

namespace Company.Product 
{ 
    using System.Text; 
    using log4net; 
    using log4net.Appender; 
    using log4net.Core; 
    using log4net.Layout; 
    using log4net.Repository.Hierarchy; 

    public static class LogHelper 
    { 
     static LogHelper() 
     { 
      var hierarchy = (Hierarchy)LogManager.GetRepository(); 
      hierarchy.Root.Level = Level.All; 
      hierarchy.Configured = true; 
     } 

     public static ILog GetLoggerRollingFileAppender(string logName, string fileName) 
     { 
      var log = LogManager.Exists(logName); 

      if (log != null) return log; 

      var appenderName = $"{logName}Appender"; 
      log = LogManager.GetLogger(logName); 
      ((Logger)log.Logger).AddAppender(GetRollingFileAppender(appenderName, fileName)); 

      return log; 
     } 

     public static RollingFileAppender GetRollingFileAppender(string appenderName, string fileName) 
     { 
      var layout = new PatternLayout { ConversionPattern = "%date{dd.MM.yyyy HH:mm:ss.fff} [%-5level] %message%newline" }; 
      layout.ActivateOptions(); 

      var appender = new RollingFileAppender 
      { 
       Name = appenderName, 
       File = fileName, 
       AppendToFile = true, 
       RollingStyle = RollingFileAppender.RollingMode.Size, 
       MaxSizeRollBackups = 2, 
       MaximumFileSize = "500KB", 
       Layout = layout, 
       ImmediateFlush = true, 
       LockingModel = new FileAppender.MinimalLock(), 
       Encoding = Encoding.UTF8, 
      }; 

      appender.ActivateOptions(); 

      return appender; 
     } 
    } 
} 

Использование для Вашего случая:

private static readonly ILog log = LogHelper.GetLoggerRollingFileAppender(typeof(App), "C:/ProgramData/CompApps/Logs/AppName/log.txt"); 

Или файл журнала ссылки полный путь из файла конфигурации приложения.

+0

Это сработало! Еще один файл конфигурации, о котором нужно беспокоиться. Хорошая вещь! – Cole

+0

как эта конфигурация изменится, если я захочу использовать https://github.com/cjbhaines/Log4Net.Async#forwarding-appenders? – Cole

+0

Не могу проверить его, потому что я в настоящее время с мобильного, но вы попробовали его и получили какую-либо ошибку? Вероятно, вам нужно будет создать скопированный файл-приложение из этой настраиваемой библиотеки в конфигурации, а не из старой библиотеки log4net. Я никогда раньше не использовал этот пакет nuget, поэтому вам лучше создать новый вопрос, если все не сработает. – Sam