2013-11-26 1 views
3

У меня есть приложение winForm. Я использую NLog для целей ведения журнала. Мой конфигурационный файл находится ниже. Могу ли я сделать какой-либо параметр в этом пользовательском файле конфигурации во время выполнения. например, для archiveAboveSize="4000" могу ли я иметь числовое значение в winform, которое может вводить это значение от пользователя (так что 4000 может быть 3000 или 5000), а затем установить это значение в файле конфигурации соответственно?Создание файла конфигурации файла NLog во время выполнения

<?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> 

ответ

3

Вы можете получить цель по имени от конфигурации NLog и изменить настройки во время выполнения:

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

К сожалению, вы не можете обновить с помощью конфигурационного файла NLog этот путь - вы должны сделать это вручную. Вы можете использовать LINQ для этого:

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); 
+0

Вы имеете в виду, что обновить файл конфигурации NLog во время выполнения нет. например от значения numericupdown? – user2968369

+0

hmm interesting .. Я никогда не работал с LINQ. Если я просто скопирую этот код в свой проект после добавления System.Xml.Linq namesapace, должен ли он работать? – user2968369

+0

как я получаю 'var fileTarget = ....' null – user2968369