2009-02-18 16 views
38

Sto cercando di personalizzare un percorso file log4net per utilizzare una proprietà che ho impostato nel dizionario log4net.GlobalContext.Properties.Come utilizzare una proprietà GlobalContext in un nome appender di log4net?

log4net.GlobalContext.Properties["LogPathModifier"] = "SomeValue"; 

Posso vedere che questo valore è impostato correttamente durante il debug attraverso di esso. e poi nella mia configurazione

<file type="log4net.Util.PatternString" 
     value="Logs\%appdomain_%property{LogPathModifier}.log" /> 

Tuttavia, l'uscita di questo mi dà "_ (null) .log" alla fine del percorso. Cosa dà?

risposta

54

Ho incontrato lo stesso comportamento e risolto impostando la variabile globale prima di chiamare il XmlConfigurator ... Ecco quello che sto usando con successo:

dettagli log4net.config:

<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender,log4net"> 
    <File type="log4net.Util.PatternString" value="App_Data/%property{LogName}" /> 
    ... 
</appender> 

globali dettagli .ASAX:

private static readonly log4net.ILog log = log4net.LogManager.GetLogger("Global.asax"); 
void Application_Start(object sender, EventArgs e) 
{ 
    // Set logfile name and application name variables 
    log4net.GlobalContext.Properties["LogName"] = GetType().Assembly.GetName().Name + ".log"; 
    log4net.GlobalContext.Properties["ApplicationName"] = GetType().Assembly.GetName().Name; 

    // Load log4net configuration 
    System.IO.FileInfo logfile = new System.IO.FileInfo(Server.MapPath("log4net.config")); 
    log4net.Config.XmlConfigurator.ConfigureAndWatch(logfile); 

    // Record application startup 
    log.Debug("Application startup"); 
} 

Spero che questo aiuti ...

+0

Avevo esattamente lo stesso problema, nel mio caso stavo cercando di accedere allo stesso file da 2 processi diversi. Stava entrando in 2 file separati, ma l'impostazione della variabile globale prima di chiamare XmlConfigurator nella seconda app ha risolto il problema. Grazie mille. +1 –

+1

ho usato 'System.Reflection.Assembly.GetExecutingAssembly(). GetName(). Nome' per il nome dell'applicazione –

+0

@Dscoduc Quale classe contiene Server.MapPath potresti condividere i dettagli – Venkat

1

Il logger è stato inizializzato tramite il metodo globale o principale nell'applicazione? Potrebbe essere che GlobalContext non sia ancora stato inizializzato.

+0

ho chiamato LogManager.GetLogger() prima di impostare la proprietà. Inoltre, la registrazione funziona correttamente, è solo che il nome del file non sta rilevando il valore personalizzato. –

13

Aggiungere type = log4net.Util.PatternString in elemento File

4

Il problema (credo) è che si ottiene (getLogger) il registratore prima di impostare il nome e caricare la configurazione ...

cercare di fare dichiarare la logger come : private static log4net.ILog _pLog e poi in Application_Start do:

void Application_Start(object sender, EventArgs e) 
{ 
    // Set logfile name and application name variables 
    log4net.GlobalContext.Properties["LogName"] = GetType().Assembly.GetName().Name + ".log"; 
    log4net.GlobalContext.Properties["ApplicationName"] = GetType().Assembly.GetName().Name; 

    // Load log4net configuration 
    System.IO.FileInfo logfile = new System.IO.FileInfo(Server.MapPath("log4net.config")); 
    log4net.Config.XmlConfigurator.ConfigureAndWatch(logfile); 

    //Get the loger 
    _pLog = log4net.LogManager.GetLogger("Global.asax"); 

    // Record application startup 
    pLog .Debug("Application startup"); 
} 

quindi la sequenza è:

// Set logfile name and application name variables 
// Load log4net configuration 
// get the logger 
// Record application startup 
Problemi correlati