2010-08-18 4 views
23

J'écris un petit utilitaire de conversion de fichiers. Les fichiers sont automatiquement convertis lorsqu'ils sont déposés dans un répertoire. J'utilise NLog pour la journalisation. Outre un fichier journal central qui est configuré en utilisant NLog.conf (et qui reçoit tous les messages générés), je voudrais créer un fichier journal supplémentaire pour chaque fichier d'entrée, ayant un nom similaire et contenant tous les messages de journal écrits pendant le Processus de conversion.Ajouter/supprimer des fichiers journaux pendant l'exécution dans NLog

Malheureusement, il semble que je ne puisse pas trouver comment ajouter correctement une nouvelle cible de fichier avec la règle appropriée pendant l'exécution. Je souhaite que tous les objets Logger écrivent dans le nouveau fichier journal pendant le processus de conversion.

J'ai essayé quelque chose comme

var logfile = new NLog.Targets.FileTarget(); 
logfile.FileName = fileName + ".log"; 
logfile.KeepFileOpen = true; 
logfile.Initialize(); 
var rule = new NLog.Config.LoggingRule("*", logfile); 
NLog.LogManager.Configuration.LoggingRules.Add(rule); 
NLog.LogManager.ReconfigExistingLoggers(); 
// 
// Proceed with converting file 
// 
logfile.Flush(); 
NLog.LogManager.Configuration.LoggingRules.Remove(rule); 
NLog.LogManager.ReconfigExistingLoggers(); 

Mais aucun fichier journal a été créé.

Qu'est-ce que je me suis trompé? Une idée?

Répondre

47

Le deuxième poste sur ce fil m'a conduit à la solution: http://nlog-project.org/forum.html#nabble-td1685349

Vous devez obtenir la configuration actuelle NLog, apporter des modifications à cet objet LoggingConfiguration, puis attribuez-lui revenir à LogManager.Configuration.

Ce code je:

LoggingConfiguration config = LogManager.Configuration; 

var logFile = new FileTarget(); 
config.AddTarget("file", logFile); 

logFile.FileName = fileName + ".log"; 
logFile.Layout = "${date} | ${message}"; 

var rule = new LoggingRule("*", LogLevel.Info, logFile); 
config.LoggingRules.Add(rule); 

LogManager.Configuration = config; 

logger.Info("File converted!"); 
+9

La ligne avec la réaffectation est très importante: LogManager.Configuration = config; – habakuk

+2

Pour clarifier ** La ligne avec la réaffectation est très importante: LogManager.Configuration = config; ** Ceci est vrai en raison de la façon dont NLog a écrit les getters et setters pour la propriété Configuration. Ce n'est pas joli, mais il faut le redéfinir avec un objet modifié; vous ne pouvez pas modifier la propriété directement. – zshift

+0

J'ai dû réassigner la variable logger à la fin pour que cela fonctionne: logger = LogManager.GetCurrentClassLogger(); – Henry

Questions connexes