2

J'ai commencé à jouer avec log4net aujourd'hui et jusqu'à présent, j'aime beaucoup. Afin de préserver notre fonctionnalité de journalisation actuelle, l'application doit créer un nouveau fichier journal à chaque démarrage de l'application. Le nom du fichier journal comporte l'horodatage. Actuellement, j'ai configuré log4net via un XmlConfigurator, ce qui fonctionne très bien, sauf que le nom de fichier pour mon RollingFileAppender est codé en dur dans le fichier XML de configuration.Configuration des appendeurs log4net via le fichier XML * et * code

Je voudrais continuer à utiliser le XmlConfigurator, mais après avoir appelé Configure(), je veux obtenir au RollingFileAppender et, dans le code, modifiez la valeur de fichier à une chaîne généré dynamiquement. L'exemple documentation online semble être en panne en ce moment, mais j'ai parcouru la référence SDK, et il semble que je pourrais utiliser le Heirarchy et GetAppenders() pour faire ce que je dois faire. Suis-je sur la bonne voie?

Ok, je pris un coup de couteau à cela et essayé le code suivant, qui ne fonctionne pas:

private static readonly ILog _log = LogManager.GetLogger(typeof(GUI)); 
// in the config file, I've set the filename to example.log, and it works 
XmlConfigurator.Configure(new FileInfo("log_config.xml")); 
Hierarchy hierarchy = LogManager.GetRepository() as Hierarchy; 
if(hierarchy != null) { 
    // get the appenders 
    IAppender[] appenders = hierarchy.GetAppenders(); 
    // change the filename for the RollingFileAppender 
    foreach(IAppender a in appenders) { 
     RollingFileAppender rfa = a as RollingFileAppender; 
     if(rfa == null) 
      continue; 
     rfa.File = "newfile.log"; // no runtime error, but doesn't work. 
    } 
} 
_log.Info("Application started"); 

Répondre

2

-vous dans ce cas besoin du appender fichier de roulement? Si ce n'est pas le cas, je m'attendrais à ce que votre code crée le résultat désiré si vous utilisez l'appender de fichier normal. Editer: Peut-être que cela fonctionne avec le RollingFile Appender si vous appelez le ActivateOptions() sur l'appender.

+0

similaire tout à fait correct! Je vous remercie! – Dave

8

Essayez cet extrait:

XmlConfigurator.Configure(); 

log4net.Repository.ILoggerRepository repo = LogManager.GetRepository(); 
foreach (log4net.Appender.IAppender appender in repo.GetAppenders()) 
{ 
if (appender.Name.CompareTo("RollingFileAppender") == 0 && appender is log4net.Appender.RollingFileAppender) 
{ 
    var appndr = appender as log4net.Appender.RollingFileAppender; 
    string logPath = "MyApplication.log"; 
    appndr.File = logPath; 
    appndr.ActivateOptions(); 
} 

J'avais posté l'article here

+0

+1 pour une implémentation plus agréable, sauf que votre appel à Configure doit spécifier le fichier XML utilisé pour la configuration. – Dave

+0

@Dave: Non, un appel à 'Configure()' utilisera le 'app.config' ou' web.config' du projet en question. – Aren

+0

@Aren ah, d'accord, merci pour la clarification. – Dave