Level 일괄 변경

Level은 모든 logger 에 대해 일괄 설정할 수도 있고 개별적으로 설정할 수도 있습니다.

일괄 설정

<configuration>
  <log4net>
     <!--Process-->
    <appender name="Process" type="log4net.Appender.RollingFileAppender">
      <file type="log4net.Util.PatternString" value="%property{LogPath}\" />
      ...
    </appender>	
	<logger name="Process">	      
      <appender-ref ref="Process" />	 	        
    </logger>
	
    <!--Action-->
    <appender name="Action" type="log4net.Appender.RollingFileAppender">
      <file type="log4net.Util.PatternString" value="%property{LogPath}\" />
      ...
    </appender>
	<logger name="Action">      
      <appender-ref ref="Action" />      
    </logger>
    <Root>
	  <level value="DEBUG" />
	</Root>
  </log4net>
</configuration>

루트(Root) 로거는 모든 로거의 상위에 위치합니다. 로그를 처리하는 기본 레벨을 정의하며, 별도의 카테고리를 지정하지 않은 로그 이벤트를 처리합니다. 따라서 로거별 레벨을 설정하더라도, 해당 로거의 레벨이 루트 로거의 레벨보다 낮은 경우 해당 로그 이벤트는 필터링되어 처리되지 않습니다. 예를 들어, Process라는 로거의 레벨을 DEBUG로 설정하고, 루트 로거의 레벨을 ERROR로 설정하면, Process에서 발생하는 로그 이벤트 중 DEBUG 레벨 이상의 로그 이벤트는 필터링되어 처리되지 않습니다. 로그 시스템이 복잡하지 않은 경우, 루트로그를 통해 레벨을 관리하는게 간편합니다. 변경 방법은 다음과 같습니다.

public LogLevel Level
{
    get => ((Hierarchy)log4net.LogManager.GetRepository()).Root.Level.ToString().ToEnum<LogLevel>();
    set
    {
        var hierarchy = (Hierarchy)log4net.LogManager.GetRepository();
        hierarchy.Root.Level = hierarchy.LevelMap[value.ToString()];
        hierarchy.Threshold = hierarchy.Root.Level;
        hierarchy.RaiseConfigurationChanged(EventArgs.Empty);
    }
}

개별 설정정

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <log4net>
     <!--Process-->
    <appender name="Process" type="log4net.Appender.RollingFileAppender">
      <file type="log4net.Util.PatternString" value="%property{LogPath}\" />
      ...
    </appender>	
	<logger name="Process">	      
      <appender-ref ref="Process" />	 	  
      <level value="DEBUG" />
    </logger>
	
    <!--Action-->
    <appender name="Action" type="log4net.Appender.RollingFileAppender">
      <file type="log4net.Util.PatternString" value="%property{LogPath}\" />
      ...
    </appender>
	<logger name="Action">      
      <appender-ref ref="Action" />
      <level value="DEBUG" />
    </logger>	
  </log4net>
</configuration>

개별 설정하는 경우, 위와 같이 logger에 level을 설정합니다.

<logger name="Action">      
      <appender-ref ref="Action" />
      <level value="DEBUG" />
</logger>	

이 경우 Level을 일괄 변경하는 방법은 다음과 같습니다.

public void SetAppendersLevel (Level _level)
{            
    var repo = log4net.LogManager.GetRepository();
    var appenders = ((Hierarchy)repo).GetAppenders();
    foreach (var f in appenders)
    {
        var logger = log4net.LogManager.GetLogger(f.Name).Logger as Logger;
        logger.Level = _level;
        ((RollingFileAppender)f).Threshold = _level;
    }
}
public void SetAppendersLevel(string _level) => SetLogLevel(log4net.LogManager.GetRepository().LevelMap[_level]);

이 경우, log.config 파일의 내용은 바뀌지 않습니다. 별도의 설정파일등을 통해 로그의 레벨을 관리하는 경우 연계하여 사용하기 좋습니다.