2013-04-30 2 views
0

콘솔 출력에 정보를 로깅하기 위해 log4net 설정을 사용하는 콘솔 응용 프로그램이 있습니다.디버그 변수가 설정된 경우에만 log4net 로그 디버그 메시지

내 응용 프로그램 내의 디버그 플래그가 설정된 경우에만 콘솔에 인쇄하고 싶은 다양한 log.Debug("Debug info") 문이 있습니다.

디버그 변수는 응용 프로그램이 호출 될 때 전달 된 스위치를 읽음으로써 설정됩니다. 인수는 NDesk.Options을 사용하여 읽습니다.

는 내가 만약에 모든 디버그 문을 포장 피하고 싶은 : - 최우선 로그의 방법이

bool debug = false; 

// read switches   
var p = new OptionSet() { 
    { "d|debug", "debug mode", v => debug = v != null }, 
}; 

if (debug) { 
    log.Debug("Debug info") 
} 

나는이 가능하도록 구성의 <log4net><appender> 섹션에 넣을 수 있나요, 또는이다. 로직을 제공하기 위해 디버그 하시겠습니까?

+0

당신은, 로깅 수준을 사용하여 볼 수 있습니다 [다른 게시물을 ] (http://stackoverflow.com/questions/8926409/log4net-hierarchy-and-logging-levels) – Thomas

+0

이것은 정적이지만? 응용 프로그램이 호출 될 때 응용 프로그램에 전달 된 스위치를 기반으로 프로그래밍 방식으로 로깅 수준을 선택하고 싶습니다. –

+1

응용 프로그램의 디버그 플래그가 프로그래밍 방식으로 설정 또는 설정 해제되었음을 의미합니까? – Thomas

답변

1

예 예를 들어,이 :

<root> 
    <level value="DEBUG" /> 
    <appender-ref ref="LogFileAppender" /> 
    <appender-ref ref="AdoNetAppender" /> 
    <appender-ref ref="EventLogAppender" /> 
</root> 
0

당신은이 같은 자신의 펜더 만들려고 할 수 있습니다 : 당신의 설정에

MyAppender.SetDebugLogging(true); 

: 코드에서 다음

public class MyAppender : AppenderSkeleton  
{ 
    private static bool TurnDebugOn = false; 
    public static SetDebugLogging(bool toSet){ 
     TurnDebugOn = toSet; 
    } 

    protected override void Append(LoggingEvent loggingEvent) 
    { 
     bool logEvent = true; 
     LogLevel logLevel = LogLevel.Err; 
     switch (loggingEvent.Level.Name) 
     { 
      case "DEBUG": 
       logEvent = TurnDebugOn; 
       logLevel = LogLevel.Debug; 
       break; 
      case "WARN": 
      case "INFO": 
       logLevel = LogLevel.Info; 
       break; 
      case "ERROR": 
       logLevel = LogLevel.Err; 
       break; 
      case "FATAL": 
       logLevel = LogLevel.Critical; 
       break; 
     } 
     if(logEvent){ 
      LogService.Log(LogNameEnum.Exception, LogCategoryEnum.BusinessLogic, logLevel, RenderLoggingEvent(loggingEvent)); 
     } 
    } 
} 

을 파일 :

... 
<appender name="AppenderToUse" type="MyAppender"> 
... 
0

당신이 코드를 사용 log4net을 초기화하는 경우는 펜더

private static void InitFileLogging(bool logDebugEvents) 
    { 
     string LOG_PATTERN = "%d [%t][%logger] %-5p %m%n"; 

     Hierarchy hierarchy = (Hierarchy)LogManager.GetRepository(); 
     TraceAppender tracer = new TraceAppender(); 
     PatternLayout patternLayout = new PatternLayout(); 

     patternLayout.ConversionPattern = LOG_PATTERN; 
     patternLayout.ActivateOptions(); 
     tracer.Layout = patternLayout; 


     tracer.ActivateOptions(); 

     hierarchy.Root.AddAppender(tracer); 

     RollingFileAppender roller = new RollingFileAppender 
     { 
      Layout = patternLayout, 
      AppendToFile = true, 
      RollingStyle = RollingFileAppender.RollingMode.Size, 
      MaxSizeRollBackups = 4, 
      MaximumFileSize = "300KB", 
      StaticLogFileName = true, 
      File = @"c:\temp\textLog.txt" 
     }; 
     if (!logDebugEvents) 
     { 
      log4net.Filter.LevelMatchFilter debugFilter = new log4net.Filter.LevelMatchFilter() { AcceptOnMatch = false, LevelToMatch = Level.Debug }; 
      roller.AddFilter(debugFilter); 
     } 
     roller.ActivateOptions(); 


     hierarchy.Root.AddAppender(roller); 

     // hierarchy.Root.Level = Level.All; 
     hierarchy.Configured = true; 

    } 
다른

당신이 externar 설정 파일이 어 펜더를 얻을 수 및 디버그 필터를 추가 usign 경우에 디버그 필터를 추가합니다.

private static void DisableDebugFileLogging() 
    { 
     XmlConfigurator.Configure(); 
     Hierarchy hierarchy = (Hierarchy)LogManager.GetRepository(); 
     foreach (var appender in hierarchy.GetAppenders()) 
     { 

      RollingFileAppender rolAppender = appender as RollingFileAppender; //or whatever appender you use 
      if (rolAppender != null) 
      { 
       log4net.Filter.LevelMatchFilter debugFilter = new log4net.Filter.LevelMatchFilter() { AcceptOnMatch = false, LevelToMatch = Level.Debug }; 
       rolAppender.AddFilter(debugFilter); 
      } 
      rolAppender.ActivateOptions(); 
     } 
    } 
0

나는 광범위하게 테스트하지 않았지만이 같은 저장소의 임계 값을 설정하여 당신이 원하는 것을 달성 할 수 있어야한다 :

var repository = LogManager.GetRepository(); 
if (repository != null) 
{ 
    if (debug) 
    { 
     repository.Threshold = Level.Debug; 
    } 
    else 
    { 
     repository.Threshold = Level.Info; 
    } 
}