web-dev-qa-db-fra.com

Comment utiliser une propriété GlobalContext dans un nom d'appender log4net?

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

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

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

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

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

40
Long Pham

J'ai rencontré le même comportement et l'ai résolu en définissant la variable globale avant d'appeler le XmlConfigurator ... Voici ce que j'utilise avec succès:

détails de log4net.config:

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

Détails de Global.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");
}

J'espère que cela t'aides...

57
Dscoduc

Ajouter un type = log4net.Util.PatternString dans l'élément File

16
David-Z

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

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

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

La séquence est donc:

// Set logfile name and application name variables
// Load log4net configuration
// get the logger
// Record application startup
4
Daniel

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

1
Dillie-O