2016-10-22 1 views
0

이것은 내 문제입니다. 두 가지 파일 (하나는 오류 및 일반 정보)은 C# application 및 log4net으로 로그인하려고합니다. 구성을 찾았습니다.Log4net은 C# 코드에서 로깅 수준이 다른 두 파일 로깅을 설정합니다

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로,하지만 난 코드에서 그것을 할 싶어,이 내가 하나 개의 파일의 설정 로깅에있는 소스입니다

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; 
    } 

} 

:

지금, 나는이 로그를 얻을이 변경을했다

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

두 appender를 "루트"로거에 추가했습니다. 두 개의 로거가 필요하면 특정 로거에 추가해야합니다.

hierarchy.Root.AddAppender(errorRoller);hierarchy.Root.AddAppender(infoRoller);은 appender가 루트가 아닌 관련 로거에 추가되므로 더 이상 필요하지 않으므로 주석을 달았습니다.

아래 코드를 찾으십시오. 거기에서 나는 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'형식의 첫 번째 인수를 받아들이에 대한 정의를 포함하지 않는 '로거 '찾을 수 있습니다 (using 지시문이나 어셈블리 참조가 누락되었습니다.) – Jujjizzu

+0

Log4net Logger 대신 Intellisense가 해당 클래스를 참조한다는 점에서 Setup2() 메서드가있는 클래스의 이름이 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

관련 문제