2009-02-18 9 views
38

J'essaie de personnaliser un chemin de fichier log4net pour utiliser une propriété que j'ai définie dans le dictionnaire log4net.GlobalContext.Properties.Comment utiliser une propriété GlobalContext dans un nom d'appendeur log4net?

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

Je peux voir que cette valeur est définie correctement lors du débogage à travers elle. puis dans ma configuration

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

Cependant, la sortie de ce qui me donne « _ (null) .log » à la fin du chemin. Ce qui donne?

Répondre

54

je suis tombé sur le même comportement et a résolu le problème en définissant la variable globale avant d'appeler la XmlConfigurator ... Voici ce que j'utilise avec succès:

Détails sur le log4net.config:

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

mondiaux détails .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"); 
} 

Hope this helps ...

+0

J'avais exactement le même problème, dans mon cas, j'essayais de me connecter au même fichier à partir de 2 processus différents. Il s'agissait d'obtenir dans 2 fichiers distincts, mais la définition de la variable globale avant d'appeler le XmlConfigurator dans la deuxième application a résolu le problème. Merci beaucoup. +1 –

+1

J'ai utilisé 'System.Reflection.Assembly.GetExecutingAssembly(). GetName(). Name' pour le nom de l'application –

+0

@Dscoduc Quelle classe contient Server.MapPath pourriez-vous s'il vous plaît partager les détails – Venkat

1

L'enregistreur a-t-il été initialisé via la méthode globale ou principale dans l'application? Il se peut que le GlobalContext n'ait pas encore été initialisé.

+0

J'ai appelé LogManager.GetLogger() avant de définir la propriété. En outre, la journalisation fonctionne correctement, c'est juste que le nom de fichier ne récupère pas la valeur personnalisée. –

13

Ajouter type = log4net.Util.PatternString dans l'élément de fichier

4

Le problème (je pense) est que vous obtenez (getLogger) l'enregistreur avant de définir le nom et charger la config ...

Essayez de faire déclarer l'enregistreur comme : private static log4net.ILog _pLog puis dans le Application_Start faire:

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

Ainsi, la séquence est la suivante:

// Set logfile name and application name variables 
// Load log4net configuration 
// get the logger 
// Record application startup 
Questions connexes