执行者被杀死后,NLog不会记录到数据库

时间:2019-02-26 10:21:08

标签: nlog

我在启动工作程序可执行文件,从工作程序获取结果的应用程序中使用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>

在某些情况下,发生问题时我会杀死工人。

当我杀死工作程序时,在日志文件中记录(使用ERROR级别)非常有用,但问题是,在大多数情况下,不会发生在DB中的记录。我在记录后杀死了可执行文件,但似乎它没有直接记录到数据库中,因此我在试图实际记录错误之前将其杀死。

因此,通过上面的配置,我在日志文件中得到了所需的错误,但在数据库中却没有,这很奇怪。

是否存在用于登录数据库的缓冲区?

是否有可以解决此问题的设置?

另外,请注意,在我看来,延迟杀死工人不是一个很好的选择,所以我想避免这种情况。

1 个答案:

答案 0 :(得分:2)

退出程序时,您需要刷新所有事件:

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

写数据库要比直接写文件花费更多的时间,因此可以解释这些差异。

另请参阅:https://github.com/NLog/NLog/wiki/Tutorial

  

记住要刷新

     

默认情况下,NLog将尝试在应用程序关闭时自动刷新。 Microsoft Windows在终止之前给.NET应用程序以有限的时间执行关闭操作(通常为2秒)。如果具有NLog Target的NLog配置需要网络流量(Http,Mail,Tcp),那么独立于Linux / Windows上的运行执行手动刷新/关闭是一个非常好的主意。

NLog.LogManager.Shutdown(); // Flush and close down internal threads and timers
     在进入应用程序关闭阶段之前,必须在Mono / Linux上运行

NET应用程序以停止线程/计时器。否则,将导致无法处理的异常和分段错误以及其他不可预测的行为。