2016-04-05 5 views
0

私は、web.configの設定でupp Log4Netを設定しており、データのプロパティに基づいてテキストログを作成したいと考えています。 (これは以前のコードでは可能でしたが、少し醜いのでweb.configにすべてを移しました):Log4Netは、RollingFileAppenderを使用してログデータと今日の日付属性を結合します。

このようなものはBOOKINGS_20160405.txtです。

ログに記録したいデータ(キー/値のある辞書)にSource:BOOKINGというキーがある場合、上記の結果が必要です。このソースはいくつかの他のカテゴリを含むことができ、それらのログファイルに保存する必要があります。

datePatternでいくつかのアプローチを試みましたが、解決策は見つかりませんでした。

これはいくつかのコードを記述しなくても可能ですか? これでRollingLogFileAppenderを使用しないでください。

多分、私は自分が望むようにカスタムを追加することができますか?

+0

これは間違いなくコード内で実行したいことのようです。特定のアペンダーは一度に1つのファイルにしか書き込めないことに注意してください。複数のログファイルと同時書き込みがある場合、ファイルごとにロックまたはより良い1つのアペンダーを使用する必要があります。 – stuartd

答えて

1

私はそれを純粋に<log4net>-configurationで解決できませんでした。私が達成したいのは、コードを変更したり、変更を再コンパイルしたりする必要のない、最大構成可能なアペンダーでした。

しかし、私はそれを動作させるためにコードをとにかく使いました。 他人に役立つかもしれない。 次のようになりました:

public class FileAppender : IAppender 
    { 
     public void RegisterLogger(ILoggerRepository repository, IConfig config) 
     { 
      if (!config.isActive) return; 
      if (repository.GetAppenders().Any(x => x.Name.Equals(config.logName, StringComparison.InvariantCultureIgnoreCase))) return; 

      if (config.path.EndsWith(@"\") == false) 
       path += @"\"; 

      var rollingFileAppender = new RollingFileAppender 
      { 
       Name = config.logName, 
       AppendToFile = true, 
       File = config.path, 
       RollingStyle = RollingFileAppender.RollingMode.Date, 
       StaticLogFileName = false, 
       DatePattern = $"'{config.logName}_'yyyyMMdd'.log'", 
       LockingModel = new log4net.Appender.FileAppender.MinimalLock(), 
       Layout = new log4net.Layout.PatternLayout("%date %-5[%level] - %message%newline"), 
      }; 

      var filters = new List<log4net.Filter.IFilter>() { 
       new log4net.Filter.LoggerMatchFilter() { LoggerToMatch = config.logName, AcceptOnMatch = true }, 
       new log4net.Filter.DenyAllFilter(), 
      }; 

      foreach (var filter in filters) 
      { 
       filter.ActivateOptions(); 
       rollingFileAppender.AddFilter(filter); 
      } 

      rollingFileAppender.ActivateOptions(); 
      log4net.Config.BasicConfigurator.Configure(rollingFileAppender); 
     } 

     public void Write(IConfig config, LogData data) 
     { 
      if (!config.isActive) return; 
      var textLogger = LogManager.GetLogger(config.logName); 
      var text = $"{data.Sender} - {data.Ip} - {data.Locator} - {data.Text} - {data.Args}"; 
      textLogger.Info(text); 
     } 
} 
関連する問題