2013-07-10 17 views
9

To jest naprawdę powszechne pytanie, ale nie byłem w stanie uzyskać odpowiedzi na temat pracy. Oto mój plik konfiguracyjny:log4net: Jak ustawić nazwę pliku rejestratora dynamicznie?

<?xml version="1.0" encoding="utf-8"?> 
<log4net> 
    <appender name="RollingFile" type="log4net.Appender.RollingFileAppender"> 
    <file value="CraneUserInterface.log" /> 
    <appendToFile value="true" /> 
    <maxSizeRollBackups value="90" /> 
    <rollingStyle value="Size" /> 

    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%date - %message%newline" /> 
    </layout> 
    </appender> 

    <root> 
    <level value="DEBUG" /> 
    <appender-ref ref="RollingFile" /> 
    </root> 

Ale muszę określić rzeczywistą nazwę pliku rejestrowania w czasie wykonywania. Znalazłem ładny przykład: here, ale kiedy próbuję przechwycić kolekcję zwróconą przez wywołanie funkcji GetIterators(), stwierdzam, że ta kolekcja jest pusta.

Muszę zmienić nazwę "CraneUserInterface.log" na "CraneUserInterface_1.log" lub 2 lub 3, zależnie od tego, co program odczyta w czasie wykonywania. Jak mogę to zrobić?

Oto mój pierwszy przebieg w użyciu kodu przedstawionego w tej próbce:

static bool ChangeLogFileName(string AppenderName, string NewFilename) 
{   
    // log4net.Repository.ILoggerRepository RootRep; 
    // RootRep = log4net.LogManager.GetRepository(); 
    log4net.Repository.ILoggerRepository RootRep = m_logger.Logger.Repository; 
    foreach (log4net.Appender.IAppender iApp in RootRep.GetAppenders()) 
    { 
    string appenderName = iApp.Name; 
    if (iApp.Name.CompareTo(AppenderName) == 0 
     && iApp is log4net.Appender.FileAppender) 
    { 
     log4net.Appender.FileAppender fApp = (log4net.Appender.FileAppender)iApp; 
     fApp.File = NewFilename; 
     fApp.ActivateOptions(); 
     return true; // Appender found and name changed to NewFilename 
    } 
} 
return false; // appender not found 
} 

Dzięki bardzo!

+0

Pomimo dwukrotnie czytanie, nie mam pojęcia, dlaczego chcesz to zrobić. –

+1

To jest do użytku w laptopie, który będzie w kabinie dźwigu w urządzeniu do wyżarzania. Zakład ma 3 dźwigi. Ponieważ nie jestem w fabryce, ani nie będę w niedalekiej przyszłości, mam symulator, który udaje, że jest trzema żurawiami. W tym samym czasie pojawią się 3 instancje tego programu. Potrzebuję śledzić zdarzenia dla każdego z 3 żurawi oddzielnie i prawdopodobnie powinienem uniknąć jakiejkolwiek szansy, aby dwa wystąpienia tego programu zapisywały się w tym samym pliku dziennika w tym samym czasie. –

+0

Myślę, że mój instynkt był prawidłowy. Próbujesz rozwiązać niewłaściwy problem. –

Odpowiedz

4

możesz użyć tej funkcji: w tej funkcji najpierw uzyskaj lokalizację pliku ustawioną w webconfig, a potem możesz dodać dowolną ścieżkę! jak Data! nasz Klient ! lub .....

webconfig:

<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender"> 
    <file value="C:\\t4\\"/> 
    <appendToFile value="true"/> 
    <rollingStyle value="Composite"/> 
    <datePattern value="_yyyy-MM-dd.lo'g'"/> 
    <maxSizeRollBackups value="10"/> 
    <maximumFileSize value="1MB"/> 
    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%date User:%identity IP:%X{addr} Browser: %X{browser} Url: %X{url} [%thread] %-5level %c:%m%n"/> 
    </layout> 
</appender> 

Funkcja:

public static void ChangeFileLocation(string _CustomerName,string _Project) 
{ 
    XmlConfigurator.Configure(); 
    log4net.Repository.Hierarchy.Hierarchy h =(log4net.Repository.Hierarchy.Hierarchy)LogManager.GetRepository(); 

    foreach (IAppender a in h.Root.Appenders) 
    { 
     if (a is FileAppender) 
     { 
      FileAppender fa = (FileAppender)a; 
      string sNowDate= DateTime.Now.ToLongDateString(); 
      // Programmatically set this to the desired location here 
      string FileLocationinWebConfig = fa.File; 
      string logFileLocation = FileLocationinWebConfig + _Project + "\\" + _CustomerName + "\\" + sNowDate + ".log"; 

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

i prowadzić tak: C: \ t4 \ TestProject \ Customer1 \ sobota, 31 sierpnia 2013.log

+0

proszę nie zamieszczać dokładnie tej samej odpowiedzi na wiele pytań - albo tak naprawdę nie pasują, albo pytanie jest duplikatem i powinno być oznaczone jako takie – kleopatra

Powiązane problemy