Comment obtenir le chemin du fichier cible en cours en utilisant NLog en runtime?

J’utilise NLog avec la configuration suivante:

      

J’ai essayé d’obtenir la propriété FileName de FileTarget (je vérifie qu’il n’y a qu’un seul FileTarget dans la collection)

 NLog.LogManager.GetCurrentClassLogger().Info("test"); var logFile = (from t in NLog.LogManager.Configuration.AllTargets where t is NLog.Targets.FileTarget select (NLog.Targets.FileTarget)t).FirstOrDefault(); 

Mais logFile.FileName ne contient que le motif du nom de fichier, exactement comme il est spécifié dans les parameters.

Comment puis-je accéder au chemin d’exécution du fichier journal actuel?

Cela a fait le tour pour moi:

 var fileTarget = (FileTarget) LogManager.Configuration.FindTargetByName("file"); // Need to set timestamp here if filename uses date. // For example - filename="${basedir}/logs/${shortdate}/trace.log" var logEventInfo = new LogEventInfo {TimeStamp = DateTime.Now}; ssortingng fileName = fileTarget.FileName.Render(logEventInfo); if (!File.Exists(fileName)) throw new Exception("Log file does not exist."); 

Cette méthode fonctionnera même si vous avez défini async="true" (c.-à-d. Que votre cible est entourée d’un AsyncTargetWrapper ) dans votre configuration XML NLog:

  private ssortingng GetLogFileName(ssortingng targetName) { ssortingng fileName = null; if (LogManager.Configuration != null && LogManager.Configuration.ConfiguredNamedTargets.Count != 0) { Target target = LogManager.Configuration.FindTargetByName(targetName); if (target == null) { throw new Exception("Could not find target named: " + targetName); } FileTarget fileTarget = null; WrapperTargetBase wrapperTarget = target as WrapperTargetBase; // Unwrap the target if necessary. if (wrapperTarget == null) { fileTarget = target as FileTarget; } else { fileTarget = wrapperTarget.WrappedTarget as FileTarget; } if (fileTarget == null) { throw new Exception("Could not get a FileTarget from " + target.GetType()); } var logEventInfo = new LogEventInfo { TimeStamp = DateTime.Now }; fileName = fileTarget.FileName.Render(logEventInfo); } else { throw new Exception("LogManager contains no Configuration or there are no named targets"); } if (!File.Exists(fileName)) { throw new Exception("File " + fileName + " does not exist"); } return fileName; } 

Je sais que ma réponse ne répond pas exactement à la question, mais le plus difficile est de trouver la bonne cible et de la lancer correctement. Nous pourrons alors accéder à toutes les propriétés. Je n’ai pas non plus trouvé de question qui corresponde à ma réponse, affichant ainsi ici …

Cette méthode fonctionnera même si vous avez défini async="true" (c.-à-d. AsyncTargetWrapper votre cible est entourée d’un AsyncTargetWrapper ou de n’importe quel TargetWrapper) dans votre configuration XML NLog:

Utiliser NLog Version: 3.1.0.0

Version d’exécution: v4.0.30319

  private Target FindTargetByName(ssortingng targetName) { if (LogManager.Configuration == null) return null; Target t = LogManager.Configuration.FindTargetByName(targetName); if (t is NLog.Targets.Wrappers.WrapperTargetBase) { var list = LogManager.Configuration.AllTargets.ToList(); t = list.Find(x => x.Name == targetName + "_wrapped"); return t; } else { return t; } } 

Utilisation de MailTarget nommé emailError

 var emailError = (MailTarget)FindTargetByName("emailError"); emailError.SmtpServer = "" //you can set or get 

Les cibles peuvent être encapsulées plusieurs fois (dans mon cas, j’avais un filtre), ainsi l’extrait suivant est une approche plus générique du déballage qui fonctionne pour plusieurs niveaux et ne fait pas d’hypothèses sur les noms de cibles.

 Target target = LogManager.Configuration.FindTargetByName(targetName); while ((target != null) && (target is WrapperTargetBase)) { target = (target as WrapperTargetBase).WrappedTarget; }