2013-07-10 16 views
9

Questa è una domanda molto comune, ma non sono stato in grado di ottenere una risposta per funzionare. Ecco il mio file di configurazione:log4net: come impostare dinamicamente il nome del file del logger?

Ma ho bisogno di determinare il nome del file di registrazione effettivo in fase di esecuzione. Ho trovato un buon esempio here, ma quando provo ad andare in loop attraverso la collezione restituita dalla chiamata a GetIterators(), trovo che quella raccolta è vuota.

Ho bisogno di cambiare il nome "CraneUserInterface.log" in "CraneUserInterface_1.log", o 2 o 3, a seconda di qualcosa che il programma legge in fase di esecuzione. Come lo posso fare?

Ecco il mio primo passaggio in utilizzando il codice presentato in quel campione:

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 
} 

Grazie mille!

+0

Nonostante leggere due volte, non ho idea perché si vuole fare questo. –

+1

Questo è per l'uso in un laptop che sarà nella cabina di una gru in un impianto di ricottura. L'impianto ha 3 gru. Dato che non sono nello stabilimento, né sarò nel prossimo futuro, ho un simulatore che finge di essere tutte e tre le gru. Ci saranno 3 istanze di questo runniing di programmi allo stesso tempo. Devo tenere traccia degli eventi per ciascuna delle 3 gru separatamente, e probabilmente dovrei evitare che due istanze di questo programma scrivano nello stesso file di registro contemporaneamente. –

+0

Penso che il mio istinto fosse giusto. Stai cercando di risolvere il problema sbagliato. –

risposta

4

è possibile utilizzare questa funzione: in questa funzione prima ottenere il percorso del file impostato in webconfig e dopo di che è possibile aggiungere qualsiasi percorso che si desidera! come la data! il nostro cliente ! o .....

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> 

Funzione:

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; 
     } 
    } 
} 

e provocare in questo modo: C: \ t4 \ TestProject \ Customer1 \ Sabato 31 agosto, 2013.log

+0

si prega di non pubblicare la stessa risposta a più domande - o non si adattano veramente o la domanda è un duplicato e devono essere contrassegnate come tali – kleopatra

Problemi correlati