una sale ruta proyecto porque online hacer empresa ejemplo critica construccion como c# nlog

c# - sale - ¿Cómo obtener la ruta del archivo de destino actual usando NLog en tiempo de ejecución?



ruta critica online (4)

Este método funcionará incluso si ha configurado async="true" (es decir, su destino está envuelto por un AsyncTargetWrapper ) en su configuración NLog XML:

private string GetLogFileName(string targetName) { string 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; }

Uso NLog con la siguiente configuración:

<targets> <target xsi:type="File" name="f" fileName="${basedir}/logs/${shortdate}.log" layout="${longdate} ${uppercase:${level}} ${message}" /> </targets> <rules> <logger name="*" minlevel="Trace" writeTo="f" /> </rules>

Traté de obtener la propiedad FileName de FileTarget ( FileTarget , que solo hay un FileTarget en la colección)

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();

Pero logFile.FileName contiene solo un patrón de nombre de archivo, exactamente cómo se especifica en la configuración.

¿Cómo puedo obtener la ruta de tiempo de ejecución del archivo de registro actual?


Esto hizo el truco para mí:

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}; string fileName = fileTarget.FileName.Render(logEventInfo); if (!File.Exists(fileName)) throw new Exception("Log file does not exist.");


Los objetivos se pueden ajustar varias veces (en mi caso, yo tenía un filtro), por lo que el siguiente fragmento es un enfoque más genérico para desenvolver que funciona para múltiples niveles y no hace suposiciones sobre los nombres de los objetivos.

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


Sé que mi respuesta no es exactamente la respuesta a la pregunta, pero lo más difícil es encontrar el objetivo correcto y emitirlo correctamente, luego podemos acceder a cualquier propiedad. Tampoco encontré una pregunta que se ajustara a mi respuesta, publicando aquí ...

Este método funcionará incluso si ha configurado async="true" (es decir, su destino está envuelto por un AsyncTargetWrapper o cualquier TargetWrapper) en su configuración NLog XML:

Usando la versión de NLog: 3.1.0.0

Versión de tiempo de ejecución: v4.0.30319

private Target FindTargetByName(string 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; } }

Uso de MailTarget llamado emailError

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