2016-07-27 15 views
2

私はWPFアプリケーションでlog4netを使用しています。 log4netはVisual Studioからアプリケーションを実行しているときに動作しますが、実行可能ファイル経由でアプリケーションを実行すると動作しません。binWPFアプリケーションの実行可能ファイルを実行しているときにlog4netが動作しない

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

そして、これは各クラスで使用されている私たちはここで、log4net.configファイルを使用している

は、それは次のようになります。ロガーを使用したい:

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

コードで設定するためのもう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

これはうまくいった!気にする設定ファイルが1つ少なくなります。いい物! – Cole

+0

https://github.com/cjbhaines/Log4Net.Async#forwarding-appendersを使用したい場合、この設定はどのように変更されますか? – Cole

+0

私は現在モバイルからlをテストしていますが、試してみましたがエラーがありますか?おそらく、従来のlog4netライブラリではなく、このカスタムライブラリからローリングファイルアペンダを作成する必要があります。私はこれまでにこのナゲットパッケージを使ったことがないので、うまくいかない場合は新しい質問を作成してください。 – Sam

関連する問題