Making NLog config file user define at run time

c#, logging, nlog

Solution

You can get target by name from NLog configuration and change settings at runtime:

var target = (FileTarget)LogManager.Configuration.FindTargetByName("file");
if (target != null)
    target.ArchiveAboveSize = 3000;

Unfortunately you can't update NLog configuration file this way - you should do that manually. You can use LINQ for that:

var nlogConfigFile = "NLog.config";
var xdoc = XDocument.Load(nlogConfigFile);
var ns = xdoc.Root.GetDefaultNamespace();
var fileTarget = xdoc.Descendants(ns + "target")
         .FirstOrDefault(t => (string)t.Attribute("name") == "file");
fileTarget.Attribute("archiveAboveSize").SetValue(3000);
xdoc.Save(nlogConfigFile);

Problem

I have a winForm app. I am using NLog for logging purpose. My config file is below. Can I make any paramter in this config file user define at run time. e.g for `archiveAboveSize="4000"` can I have a numericupdown in winform which can take input this value from user (so that 4000 can be 3000 or 5000) and then set this value in config file accordingly ? ``` <?xml version="1.0" encoding="utf-8" ?> <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <targets> <target xsi:type="File" name="file" layout="${longdate}|${level:uppercase=true}|${logger}|${message}" archiveAboveSize="4000" maxArchiveFiles="1" archiveFileName="${basedir}/log_archived.txt" fileName="log.txt" /> </targets> <rules> <logger name="*" minlevel="Info" writeTo="file" /> </rules> </nlog> ```

Original source