Расположение журналов Nlog, перезаписанное кодом, все еще ведение журнала происходит в расположении конфигурации - PullRequest
1 голос
/ 13 октября 2019

NLog версия - 4.4.3

Платформа - .Net 4.5.2

Текущая конфигурация NLog -

<nlog autoReload="true" xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <variable name="layout" value="${longdate}|${level:uppercase=true}|${threadid}|${logger}|${message}" />
  <variable name="logLocation" value="logs" />
  <targets async="true">
    <target name="debugger" xsi:type="Debugger" layout="${layout}" />
    <target name="console" xsi:type="Console" layout="${layout}" />
    <target name="logfile" 
            xsi:type="File" 
            fileName="${logLocation}\${processname}.log" 
            archiveFileName="${logLocation}\\${processname}.{###}.log" 
            archiveEvery="Day" 
            archiveAboveSize="2048000" 
            archiveNumbering="Rolling" 
            maxArchiveFiles="10" 
            concurrentWrites="false" 
            keepFileOpen="false" 
            layout="${layout}" />
  </targets>
  <rules>
    <logger name="*" minlevel="Info" writeTo="logfile" />
    <logger name="*" minlevel="Debug" writeTo="debugger" />
    <logger name="*" minlevel="Info" writeTo="console" />
  </rules>
</nlog>

Код для переопределения местоположения

LogManager.ReconfigExistingLoggers();
var target = (FileTarget)LogManager.Configuration.FindTargetByName<AsyncTargetWrapper>("logfile").WrappedTarget;
target.FileName = $@"..\..\..\..\logs\Foobar.log";
  • Каков текущий результат? Когда приложение / служба запускается, оно записывает в перезаписанное местоположение, но иногда (не уверен в сценарии - возможно опрокидывание) оно начинает запись в конфигурационное местоположение.

  • Что такоеожидаемый результат? Журналы всегда должны быть записаны в перезаписанное место.

  • Вы проверяли Внутренний журнал ? Нет

  • Пожалуйста, опубликуйте полную информацию об исключении (сообщение, отслеживание стека, внутренние исключения)Нет исключений

  • Есть ли обходные пути? да нетПерезапустите службу / приложение.

  • Есть ли версия, в которой он работал? Без понятия. Это версия, с которой мы начали и которой придерживаемся.

  • Можете ли вы помочь нам, написав модульный тест? Модульные тесты не помогут, поскольку это прерывистый сценарий.

Ответы [ 2 ]

1 голос
/ 13 октября 2019

У вас включена автоматическая перезагрузка (<nlog autoReload="true”), поэтому, если потребуется перезагрузка (после сна или изменения в конфигурации), вы потеряете изменения, внесенные в код.

Решение - отключить автоматическую перезагрузку. или установите изменение после перезагрузки еще раз. См. Пример кода:

static void Main(string[] args)
{
    UpdateNLogConfig();

    LogManager.ConfigurationReloaded += LogManager_ConfigurationReloaded;

    log.Info("Entering Application.");

    Console.WriteLine("Press any key to exit ...");
    Console.Read();
}


private static void LogManager_ConfigurationReloaded(object sender, LoggingConfigurationReloadedEventArgs e)
{
    UpdateNLogConfig();
}

private static void UpdateNLogConfig()
{
    //note: don't set  LogManager.Configuration because that will overwrite the nlog.config settings
    var target = (FileTarget)LogManager.Configuration.FindTargetByName<AsyncTargetWrapper>("logfile").WrappedTarget;
    target.FileName = $@"..\..\..\..\logs\Foobar.log";   
    LogManager.ReconfigExistingLoggers();
}

См. Также Объединение конфигурации XML с C # config · NLog / NLog Wiki

0 голосов
/ 20 октября 2019

Вместо выполнения поиска цели и непосредственного изменения свойств цели. Затем я предлагаю использовать NLog Layout Logic.

<nlog autoReload="true" xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <targets async="true">
    <target name="logfile" 
            xsi:type="File" 
            fileName="${gdc:item=logFile:whenEmpty=log/${processname}.log}" />
  </targets>
  <rules>
    <logger name="*" minlevel="Info" writeTo="logfile" />
  </rules>
</nlog>

А затем просто назначьте logLocation:

NLog.GlobalDiagnosticsContext.Set("logFile", $@"..\..\..\..\logs\Foobar.log");

Использование GDC также будет очень хорошо работать с autoReload=true и не нужнопозвонить LogManager.ReconfigExistingLoggers().

...