2013-06-17 8 views
6

È possibile modificare il nome di un file di registro per un fileappender mentre l'applicazione è in esecuzione? Sarà fatto alcune volte al giorno.Cambia il nome del file di log alcune volte durante il runtime

Cercherò di elaborarmi un po 'di più: la mia app scrive il firmware su un dispositivo. Tutti i dispositivi su cui l'utente ha già lavorato, sono in una griglia. L'utente può avviare una nuova procedura guidata di scrittura o può riprendere o riavviare l'azione su un dispositivo già avviato. Quello che mi piacerebbe fare è tenere un registro di tutti i passaggi eseguiti dall'utente per un determinato dispositivo.

Ad esempio: quando l'utente lavora sul dispositivo AB0124, voglio scrivere in un file di registro chiamato AB0124.log. Quando termina di lavorare su quel dispositivo e inizia sul dispositivo XY5618, voglio registrare queste azioni in XY5618.log

Ho letto che è possibile utilizzare una proprietà di contesto (here e here e molti altri post) , ma è necessario impostare la proprietà prima di creare il logger. Quindi, invece di creare un logger nella classe, ne creo uno nel mio metodo dopo aver impostato la proprietà. Ma finora non viene registrato nulla.

Quando imposto il nome file hardcoded nella configurazione, funziona. Mi manca qualcosa qui?

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

E nei AssemblyInfo.cs:

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

risposta

7

La risposta di Peter mi ha portato nella giusta direzione, ma ho finito per farlo in codice invece di modificare e salvare il file di configurazione.

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

Grazie per l'esempio. Esattamente quello di cui ho bisogno! – AngieM

+0

Questa è la migliore implementazione che ho trovato ... Grazie ... – Emerson

1

Yo puoi aprire il file log4net.config dalla tua applicazione e cambiare il nome. Quindi salvare il file (log4net.config) e il file di registrazione verrà modificato.

Problemi correlati