Change Based on NLog Run-Time Objectives Programmatically

I have a Windows Forms NET 4.5 (VS 2013) application using NLog.

I have goals:

<target name="asyncFileLog" xsi:type="AsyncWrapper"> <target name="logfileTrace" xsi:type="File" fileName="${basedir}/logs/${shortdate}Trace.log" layout="${longdate} ${message}" lineEnding="Default"/> </target> <target name="asyncFileError" xsi:type="AsyncWrapper"> <target name="logfileError" xsi:type="File" fileName="${basedir}/logs/${shortdate}Error.log" layout="${longdate} ${message} ${exception:format=tostring}" lineEnding="Default"/> </target> 

LogManager.Configuration.AllTargets.ToList(); returns 4 elements, not 2 elements.

I want to change the path of $ {basedir} / logs at runtime, programmatically

I try this:

 var rutaLogs = ConfigurationManager.AppSettings["RutaLog"]; if (!Directory.Exists(rutaLogs)) return; var list = LogManager.Configuration.AllTargets.ToList(); foreach (var target in list) { FileTarget fileTarget = null; var wrapperTarget = target as WrapperTargetBase; // Unwrap the target if necessary. if (wrapperTarget == null) { fileTarget = target as FileTarget; } else { fileTarget = wrapperTarget.WrappedTarget as FileTarget; continue; } var value = fileTarget.FileName.ToString(); value = value.Replace("${basedir}/logs/", rutaLogs); fileTarget.FileName = value; } 

Does not generate anything. I am also trying to use LogManager.ReconfigExistingLoggers(); but does not work.

Any suggestions?

+7
source share
2 answers

In this case, it is easier to use variables. ( ${var:...} )

In this example:

 <variable name="basedir" value="${basedir}" /> <!-- default, optional --> <targets> <target name="asyncFileLog" xsi:type="AsyncWrapper"> <target name="logfileTrace" xsi:type="File" fileName="${var:basedir}/logs/${shortdate}Trace.log" layout="${longdate} ${message}" lineEnding="Default"/> </target> ... 

Changing a variable in C #

 // create or edit LogManager.Configuration.Variables["basedir"] = "d:/mybasedir"; 

No need for LogManager.ReconfigExistingLoggers(); or iterate over all the targets!

See also the documentation ${var}

Update : in this case you are reading .config files, this can only be done with the NLog configuration (no need for C #!)

Install NLog.Extended and use ${appsetting:name=..}

eg.

 fileName="${var:basedir}/logs/${appsetting:name=RutaLog}Trace.log" 

See also the documentation ${appsetting}

+12
source

this is my nlog file setup

  <target name="file" xsi:type="File" layout="${longdate} | ${level:uppercase=true} | ${message} ${newline} ${event-properties:item=prop}" archiveAboveSize="4096" keepFileOpen="true" encoding="utf-8" /> 

and the code is behind

 string filename = "file.log"; var fileTarget = (FileTarget)config.FindTargetByName("file"); fileTarget.FileName = Path.Combine(folder, filename); fileTarget.ArchiveFileName = "file.{##}.log"; 

But it does not create archives at all. Am I making a mistake? Help me here thanks

0
source

Source: https://habr.com/ru/post/1264929/


All Articles