2016-10-22 13 views
0

これは私の問題です.2つの異なるファイル(エラーと通常の情報)をC#アプリケーションとlog4netでログインしたいのですが、log4netは、異なるレベルの2つのファイルをログに記録します。

private readonly ILog log = LogManager.GetLogger("GENERAL-LOG"); 

と:ロギング用に別のクラスに

public static void Setup() 
    { 

     Hierarchy hierarchy = (Hierarchy)LogManager.GetRepository(); 
     hierarchy.Root.RemoveAllAppenders(); 

     PatternLayout patternLayout = new PatternLayout(); 

     patternLayout.ConversionPattern = "%date THREAD [%thread] %logger: %message%newline"; //%-5level 
     patternLayout.ActivateOptions(); 

     RollingFileAppender infoRoller = new RollingFileAppender(); 

     infoRoller.AppendToFile = true; 
     infoRoller.File = @"logs\"; 
     infoRoller.RollingStyle = RollingFileAppender.RollingMode.Date; 
     infoRoller.MaxSizeRollBackups = 3; 
     infoRoller.Layout = patternLayout; 
     infoRoller.DatePattern = @"IN\FO\_yyyy-MM-dd.\lo\g"; 
     infoRoller.StaticLogFileName = false; 

     infoRoller.ActivateOptions(); 

     hierarchy.Root.AddAppender(infoRoller); 

     MemoryAppender memory = new MemoryAppender(); 

     memory.ActivateOptions(); 
     hierarchy.Root.AddAppender(memory); 

     hierarchy.Root.Level = Level.Debug; 
     hierarchy.Configured = true; 
    } 

:XMLでは、私は、コードからそれをやりたい、これは私が1つのファイルの設定ログが見つかり源であります

Logger.Setup(); 
log.Debug("Configurazioni caricate con successo."); 

コードが機能します。他のクラスから

public static void Setup() 
    { 

     Hierarchy hierarchy = (Hierarchy)LogManager.GetRepository(); 
     hierarchy.Root.RemoveAllAppenders(); 

     PatternLayout patternLayout = new PatternLayout(); 

     patternLayout.ConversionPattern = "%date THREAD [%thread] %logger: %message%newline"; //%-5level 
     patternLayout.ActivateOptions(); 

     RollingFileAppender infoRoller = new RollingFileAppender(); 

     infoRoller.AppendToFile = true; 
     infoRoller.File = @"logs\"; 
     infoRoller.RollingStyle = RollingFileAppender.RollingMode.Date; 
     infoRoller.MaxSizeRollBackups = 3; 
     infoRoller.Layout = patternLayout; 
     infoRoller.DatePattern = @"IN\FO\_yyyy-MM-dd.\lo\g"; 
     infoRoller.StaticLogFileName = false; 

     infoRoller.ActivateOptions(); 
     hierarchy.Root.AddAppender(infoRoller); 

     //ADDED CODE 
     RollingFileAppender errorRoller = new RollingFileAppender(); 

     errorRoller.AppendToFile = true; 
     errorRoller.File = @"logs\"; 
     errorRoller.RollingStyle = RollingFileAppender.RollingMode.Date; 
     errorRoller.MaxSizeRollBackups = 3; 
     errorRoller.Layout = patternLayout; 
     errorRoller.DatePattern = @"ERROR_yyyy-MM-dd.\lo\g"; 
     errorRoller.StaticLogFileName = false; 

     errorRoller.ActivateOptions(); 
     hierarchy.Root.AddAppender(errorRoller); 

     MemoryAppender memory = new MemoryAppender(); 

     memory.ActivateOptions(); 
     hierarchy.Root.AddAppender(memory); 

     hierarchy.Root.Level = Level.Debug; 
     hierarchy.Configured = true; 
    } 

} 

は今、私は2ログを取得するには、この変更を行った

private readonly ILog log = LogManager.GetLogger("GENERAL-LOG"); 
    private readonly ILog elog = LogManager.GetLogger("ERROR-LOG"); 

    Logger.Setup(); 
    log.Debug("prova scrittura in file1"); 
    elog.Error("prova errore scrittura in file2"); 

結果:両方のログファイルは二つのメッセージが書き込まれます。

ご迷惑をおかけしますようお願い申し上げます。

答えて

0

問題は、両方のアペンダーを「ルート」ロガーに追加したことです。 2つのロガーを使用する場合は、それらを特定のロガーに追加する必要があります。

hierarchy.Root.AddAppender(errorRoller);hierarchy.Root.AddAppender(infoRoller);は、ルートの代わりに関連するロガーにアペンダーが追加されるため、もはや必要ではないので、コメントしました。

以下のコードを検索してください。そこでは、メソッドにパラメータとしてlogとelogを渡し、関連するappendersをそれぞれ追加しました。メソッドに呼び出し

private static void Setup2(ILog infoLog, ILog elog) 
    { 
     Hierarchy hierarchy = (Hierarchy)LogManager.GetRepository(); 
     hierarchy.Root.RemoveAllAppenders(); 

     PatternLayout patternLayout = new PatternLayout(); 

     patternLayout.ConversionPattern = "%date THREAD [%thread] %logger: %message%newline"; //%-5level 
     patternLayout.ActivateOptions(); 

     RollingFileAppender infoRoller = new RollingFileAppender(); 

     infoRoller.AppendToFile = true; 
     infoRoller.File = @"logs\"; 
     infoRoller.RollingStyle = RollingFileAppender.RollingMode.Date; 
     infoRoller.MaxSizeRollBackups = 3; 
     infoRoller.Layout = patternLayout; 
     infoRoller.DatePattern = @"IN\FO\_yyyy-MM-dd.\lo\g"; 
     infoRoller.StaticLogFileName = false; 
     infoRoller.ActivateOptions(); 
     // hierarchy.Root.AddAppender(infoRoller); //Not appended to the root logger anymore 

     //ADDED CODE 
     RollingFileAppender errorRoller = new RollingFileAppender(); 

     errorRoller.AppendToFile = true; 
     errorRoller.File = @"logs\"; 
     errorRoller.RollingStyle = RollingFileAppender.RollingMode.Date; 
     errorRoller.MaxSizeRollBackups = 3; 
     errorRoller.Layout = patternLayout; 
     errorRoller.DatePattern = @"ERROR_yyyy-MM-dd.\lo\g"; 
     errorRoller.StaticLogFileName = false; 
     errorRoller.ActivateOptions(); 
     // hierarchy.Root.AddAppender(errorRoller); //Not appended to the root logger anymore 

     MemoryAppender memory = new MemoryAppender(); 

     memory.ActivateOptions(); 
     hierarchy.Root.AddAppender(memory); 
     hierarchy.Root.Level = Level.Debug; 
     hierarchy.Configured = true; 

     ILog log = infoLog; 
     Logger logger = (Logger)log.Logger; 
     logger.AddAppender(errorRoller); 

     log = elog; 
     logger = (Logger)log.Logger; 
     logger.AddAppender(infoRoller); 
    } 

private readonly ILog log = LogManager.GetLogger("GENERAL-LOG"); 
    private readonly ILog elog = LogManager.GetLogger("ERROR-LOG"); 

    Logger.Setup2(log,elog); 
    log.Debug("prova scrittura in file1"); 
    elog.Error("prova errore scrittura in file2"); 
+0

どうもありがとう、しかし、コンパイラ書き込みこのエラーをありがとう:「ロガー」は「AddAppender」となし拡張メソッドの定義が含まれていません「AddAppender」タイプ「ロガーの最初の引数を受け入れます'が見つかりました(使用するディレクティブまたはアセンブリ参照がありませんか?) – Jujjizzu

+0

Log4net Loggerの代わりにIntellisenseがそのクラスを参照するように、Setup2()メソッドを持つクラスにLoggerと名前を付けたという問題があると思います。あなたのクラスの名前を何かに変更し、解決策を試してみてください。呼び出すクラス名はLoggerではないので、上のコードは私にとってうまくいきます。 –

0

以下のコードブロックとセットアップ()メソッドに関連するコード・ブロックを交換してください。

変更点: 1.「hierarchy.Root.AddAppender(infoRoller);」を削除しました。 "hierarchy.Root.AddAppender(errorRoller);"とコメントしました。 2.あなたのケースでは必要ではないように、「MemoryAppender」を削除しました。

public static void Setup() 
     { 


      Hierarchy hierarchy = (Hierarchy)LogManager.GetRepository(); 
      hierarchy.Root.RemoveAllAppenders(); 

      PatternLayout patternLayout = new PatternLayout(); 

      patternLayout.ConversionPattern = "%date THREAD [%thread] %logger: %message%newline"; //%-5level 
      patternLayout.ActivateOptions(); 


      ILog log = LogManager.GetLogger("GENERAL-LOG"); 
      Logger l = (Logger)log.Logger; 

      RollingFileAppender infoRoller = new RollingFileAppender(); 

      infoRoller.AppendToFile = true; 
      infoRoller.File = @"logs\"; 
      infoRoller.RollingStyle = RollingFileAppender.RollingMode.Date; 
      infoRoller.MaxSizeRollBackups = 3; 
      infoRoller.Layout = patternLayout; 
      infoRoller.DatePattern = @"IN\FO\_yyyy-MM-dd.\lo\g"; 
      infoRoller.StaticLogFileName = false; 
      infoRoller.ActivateOptions(); 

      l.AddAppender(infoRoller); 


      //ADDED CODE 

      ILog elog = LogManager.GetLogger("ERROR-LOG"); 
      Logger el = (Logger)elog.Logger; 


      RollingFileAppender errorRoller = new RollingFileAppender(); 

      errorRoller.AppendToFile = true; 
      errorRoller.File = @"logs\"; 
      errorRoller.RollingStyle = RollingFileAppender.RollingMode.Date; 
      errorRoller.MaxSizeRollBackups = 3; 
      errorRoller.Layout = patternLayout; 
      errorRoller.DatePattern = @"ERROR_yyyy-MM-dd.\lo\g"; 
      errorRoller.StaticLogFileName = false; 

      errorRoller.ActivateOptions(); 

      el.AddAppender(errorRoller); 
      //hierarchy.Root.AddAppender(errorRoller); 

      MemoryAppender memory = new MemoryAppender(); 

      memory.ActivateOptions(); 
      hierarchy.Root.AddAppender(memory); 
      hierarchy.Configured = true; 
     } 

希望すると、これが役立ちます。

は、あなたの答えを

+0

あなたのアドバイスありがとう! – Jujjizzu

関連する問題