2013-06-17 3 views
6

응용 프로그램이 실행되는 동안 fileappender에 대한 로그 파일의 이름을 변경할 수 있습니까? 하루에 몇 차례 일할 것입니다.런타임 중에 로그 파일 이름을 몇 번 변경하십시오.

내 앱이 기기에 펌웨어를 씁니다. 사용자가 이미 작업 한 모든 장치는 그리드에 있습니다. 사용자는 새로운 쓰기 마법사를 시작하거나 이미 시작한 장치에서 작업을 재개하거나 다시 시작할 수 있습니다. 내가하고 싶은 것은 특정 장치에 대해 사용자가 수행 한 모든 단계의 로그를 유지하는 것입니다.

예 : 사용자가 AB0124 디바이스에서 작업 할 때 AB0124.log라는 로그 파일에 기록하고 싶습니다. 해당 장치에서 작업을 끝내고 장치 XY5618에서 작업을 시작하면 해당 작업을 XY5618.log에 기록합니다.

컨텍스트 속성 (herehere 및 기타 많은 게시물을 사용할 수 있음)을 읽었습니다. 로거를 만들기 전에 속성을 설정해야합니다. 그래서 클래스에 로거를 만드는 대신 속성을 설정 한 후 메서드에서 만듭니다. 그러나 지금까지 아무것도 기록되지 않습니다.

config에 하드 코드 된 파일 이름을 설정하면 작동합니다. 여기에 분실물이 있습니까?

Log4Net.config :

<appender name="StepsLogAppender" type="log4net.Appender.FileAppender"> 
    <filter type="log4net.Filter.LevelMatchFilter"> 
    <levelToMatch value="INFO"/> 
    </filter> 
    <filter type="log4net.Filter.DenyAllFilter" /> 
    <file type="log4net.Util.PatternString" value="%property{LogPathModifier}" /> 
    <layout type="log4net.Layout.PatternLayout"> 
    <conversionPattern value="%date{dd/MM/yyyy - HH:mm:ss} - %message%newline" /> 
    </layout> 
</appender> 

<root> 
    <level value="ALL" /> 
    <appender-ref ref="StepsLogAppender" /> 
</root> 

C 번호 :

public void WriteStepInfo(string device, int step) 
{ 
    log4net.ThreadContext.Properties["LogPathModifier"] = string.Format("D:\\StepsDevice_{0}.txt", device); 
    var log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 
    log.Info(string.Format("Device {0} - step {1}.", device, step)); 
} 

그리고 의 AssemblyInfo.cs에서 :

[assembly: log4net.Config.XmlConfigurator(ConfigFile = "Log4Net.config", Watch = true)] 

답변

7

피터의 대답은 올바른 방향으로 나를 데려왔지만, 설정 파일을 편집하고 저장하는 대신 코드로 끝내게되었습니다.

public void WriteStepInfo(string device, int step) 
{ 
    var h = (log4net.Repository.Hierarchy.Hierarchy)LogManager.GetRepository(); 
    foreach (IAppender a in h.Root.Appenders) 
    { 
     if (a.Name == "StepsLogAppender") 
     { 
      FileAppender fa = (FileAppender)a; 
      var logFileLocation = string.Format(".\\Logs\\Device_{0}.log", device); 

      fa.File = logFileLocation; 
      fa.ActivateOptions(); 
      break; 
     } 
    } 

    Log.Info(string.Format("Device {0} - step {1}. Different file for each device", device, step)); 
} 
+0

예를 들어 주셔서 감사합니다. 정확히 내가 필요로하는 것! – AngieM

+0

이것은 내가 찾은 최고의 구현입니다 ... 감사합니다 ... – Emerson

1

요 u 응용 프로그램에서 log4net.config 파일을 열고 이름을 변경할 수 있습니다. 그런 다음 파일 (log4net.config)을 저장하면 로깅 파일이 변경됩니다.

관련 문제