1

xml 구성을 업데이트하고 다시 배포하지 않고 log4net이 프로그램의 특정 조건을 통해 의도 한 로그의 대상 위치를 변경하도록 할 수 있습니까?log4net이 프로그래밍 방식으로 텍스트에서 데이터베이스로 대상을 이벤트 로그로 변경합니다.

구성 의존적 인 솔루션을 원하지 않습니다. 그것은 순전히 코드를 통해 작동합니다. 나는 선택할 수있는 목표를 내 프로그램에 알릴 수있는 기반 조건을 가지고 있습니다. 어떤 경우 프로그램은 미리 정의 된 경로의 텍스트 파일이나 미리 정의 된 서버/데이터베이스의 SQL Server 또는 응용 프로그램 제품군 이름 아래의 이벤트 로그로 자동 전환합니다. 파일 경로, SQL 연결 문자열 및 이벤트 로그 매개 변수는 내 응용 프로그램 구성 파일에 저장된 유일한 것입니다.

log4net에서도이 작업을 수행 할 수 있습니까? 검색 한 내용과 관련이없는 항목을 찾을 수 없으므로 아직 표시 할 수있는 코드가 없습니다. 대부분의 대답은 기본 디렉토리 위치를 변경하는 방법 이었지만 원하는 것은 아닙니다.

감사

답변

2

난 당신 만의 코드에 펜더 변경에 대한 이야기를 알고,하지만 난 정말 당신이 코드에서 컨텍스트 속성 집합에 따라 선택 펜더를 사용하여 더 많은 혜택을 누릴 것이라고 생각

예는 할 것 구성 파일에서이 같은 :

<appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender,log4net"> 

    <filter type="log4net.Filter.PropertyFilter"> 
    <key value="target" /> 
    <stringToMatch value="DB" /> 
    <acceptOnMatch value="true" /> 
    </filter> 
    <filter type="log4net.Filter.DenyAllFilter" /> 

<!-- your ado configuration --> 


<appender name="AnotherAppender" type="log4net.Appender.EventLogAppender,log4net"> 

    <filter type="log4net.Filter.PropertyFilter"> 
    <key value="target" /> 
    <stringToMatch value="EventLog" /> 
    <acceptOnMatch value="true" /> 
    </filter> 
    <filter type="log4net.Filter.DenyAllFilter" /> 

<!-- your Eventlog configuration --> 

그런 다음 코드에서, 당신은 목적지까지의 로거 target 속성을 설정할 수 있습니다 당신이 원하는 :

var isDB = true; 
var loggingEvent = new LoggingEvent(typeof(Program), Log.Logger.Repository, Log.Logger.Name, Level.Info, "message", null); 
loggingEvent.Properties["target"] = isDB ? "DB" : "EventLog"; 
Log.Logger.Log(loggingEvent); 

코드에서 마술 로깅 출력을 숨기지 않고 출력을 구성 할 수 있으므로 쉽게 변경할 수 있으므로 라우팅 만이 응용 프로그램 내부에서 처리해야합니다.

메시지 당 컨텍스트가 필요하지 않은 경우 (예를 들어 라우팅 라우팅 변경이 오랜 시간 동안 다시 전환되지 않는다는 것을 알고있는 경우) 설정할 수있는 세 가지 컨텍스트 중 하나를 사용할 수 있습니다 세계적 :

  • log4net.GlobalContext
  • log4net.ThreadContext이 같은 스레드에서 로거간에 공유되는 응용 프로그램의 모든 로거에 사용되는
  • ThreadLogicalContext는 스레드에 대한 동일한 논리 경계에서 로거간에 공유되는 log4net. (more info on the difference)
0

프로그래밍 방식 펜더 당 로깅을 전환하는 것이 가능하다. 정의한 조건에 따라 로깅 임계 값을 제어 할 수 있습니다.

예를 들어, 이것은 "Audit"접두어가 붙은 이름을 가진 appenders를 토글하는 일부 코드입니다.

 private static void ToggleAuditing(bool enabled) 
    { 
     log4net.Appender.IAppender[] appenders = log4net.LogManager.GetRepository().GetAppenders(); 

     foreach (log4net.Appender.IAppender app in appenders) 
     { 
      log4net.Appender.AppenderSkeleton skel = app as log4net.Appender.AppenderSkeleton; 

      if (skel != null && app.Name.StartsWith("Audit")) 
      { 
       skel.Threshold = enabled ? Level.All : Level.Off; 
      } 
     } 
    } 
+0

새 구성을 사용하려면 각 appender에서 ActivateOptions()를 호출해야합니다. – stuartd