NLog не регистрируется в базе данных, когда исполнителя убивают - PullRequest
0 голосов
/ 26 февраля 2019

Я использую NLog в приложении, которое запускает исполняемый файл работника, получает результаты от работника, а затем сам работник убивается или выходит из него.

Это конфигурация, которую я использую:

  <nlog autoReload="true" throwExceptions="true" internalLogFile="c:\webapplogs\Nloglog.log" internalLogLevel="Warn" xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <variable name="datasource" value="Data Source=.;Initial Catalog=DEV_DB;Persist Security Info=True;User ID=****" />
    <variable name="logDirectory" value="C:\webapplogs\/logs" />
    <variable name="message_one_line" value="${replace:inner=${message}:searchFor=\\r\\n|\\r|\\n:replaceWith=\xB6:regex=true}" />
    <!--Pilcrow = "\xB6";-->
    <variable name="exception_one_line" value="${replace:inner=${exception:format=tostring}:searchFor=\\r\\n|\\r|\\n:replaceWith=\xB6:regex=true}" />
    <!--Pilcrow = "\xB6";-->
    <variable name="exception_and_message_with_level" value="${longdate} =&gt; (${uppercase:${level}}) | ${callsite} : ${message_one_line} | ${exception_one_line}" />
    <variable name="trace" value="${longdate} =&gt; ${message_one_line}" />
    <targets>
      <!-- https://github.com/nlog/NLog/wiki/File-target -->
      <target name="logfile" type="File" fileName="${logDirectory}/${shortdate}.${logger}.CmdLineWorker.Tracing.log" layout="${exception_and_message_with_level}" keepFileOpen="True" concurrentWrites="True" openFileCacheTimeout="30" />
      <target name="tracefile" type="File" fileName="${logDirectory}/${shortdate}.${logger}.log" layout="${trace}" keepFileOpen="True" concurrentWrites="True" openFileCacheTimeout="30" />
      <target name="console" type="Console" layout="${message}" />
      <target name="database" type="Database" connectionString="${datasource}" commandText="exec dbo.Error_Insert @********">
        <parameter name="@ErrDate" layout="${date:format=yyyy-MM-dd HH\:mm\:ss}" />
        <parameter name="@ErrUser" layout="CmdLineWorker" />
        <parameter name="@LogLevel" layout="${level}" />
        <parameter name="@ErrOrganization" layout="CmdLineWorker" />
        <parameter name="@ErrMessage" layout="${message}" />
        <parameter name="@ErrInnerException" layout="${exception:format=ToString}" />
        <parameter name="@ErrCallsite" layout="${callsite}" />
      </target>
    </targets>
    <rules>
      <logger name="*" minlevel="Trace" writeTo="logfile" />
      <logger name="*" minLevel="Error" writeTo="database" />
    </rules>
  </nlog>

В некоторых ситуациях я убиваю работника, когда что-то идет не так.

Когда я убиваю работника, ведение журнала (используя уровень ОШИБКИ) в файле журнала работает отлично, но проблема в том, что большинствовремя входа в БД не происходит.Я убиваю исполняемый файл после регистрации, но кажется, что он не регистрируется напрямую в БД, поэтому я убиваю его до того, как он попытается действительно зарегистрировать ошибку.

Итак, с помощью конфигурации выше, я получаю желаемоеошибка в файле журнала, но не в БД, что нечетно.

Есть ли буфер для входа в БД?

Есть ли параметр, который может решить эту проблему?

Также обратите внимание, что отсрочка для убийства работника - не очень хороший вариант в моем случае, поэтому я бы хотел этого избежать.

1 Ответ

0 голосов
/ 26 февраля 2019

При выходе из программы необходимо сбросить все события:

NLog.LogManager.Shutdown(); // Flush and close down internal threads and timers

Запись в базу данных может занять больше времени, чем непосредственно в файл, что может объяснить различия.

См. Также: https://github.com/NLog/NLog/wiki/Tutorial

Не забудьте очистить

По умолчанию NLog попытается выполнить автоматическую очистку при завершении работы приложения.Microsoft Windows предоставляет приложениям .NET ограниченное количество времени для завершения работы (обычно 2 секунды) перед прекращением работы.Если у вас есть конфигурация NLog с NLog Targets, которая требует сетевого трафика (Http, Mail, Tcp), то это действительно хорошая идея - выполнить ручную очистку / выключение независимо от работы в Linux / Windows.

NLog.LogManager.Shutdown(); // Flush and close down internal threads and timers

NET Приложения, работающие в Mono / Linux, обязаны останавливать потоки / таймеры перед входом в фазу закрытия приложения.Невыполнение этого требования может привести к необработанным исключениям, ошибкам сегментации и другим непредсказуемым действиям.

...