C# 以编程方式配置NLog

C# 以编程方式配置NLog,c#,logging,configuration,.net-4.5,nlog,C#,Logging,Configuration,.net 4.5,Nlog,我有一个NLog的工作配置。我使用NLog.config <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" autoReload="true" internalLogFile="e:\InternalLog.txt" throwExceptions="true"> <targets> &

我有一个NLog的工作配置。我使用NLog.config

<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" autoReload="true" internalLogFile="e:\InternalLog.txt" throwExceptions="true">
  <targets>
    <target name="database" xsi:type="Database">
      <connectionStringName>DB.Log</connectionStringName>
      <commandText>
        insert into dbo.Log (
          Logged, Level, Message, Username, Url, Logger, CallSite, Exception, Stacktrace, remoteAddress
        ) values (
          @Logged, @Level, @Message, @Username, @Url, @Logger, @CallSite, @Exception, @Stacktrace, @RemoteAddress
        );
      </commandText>
      <parameter name="@logged" layout="${date}" />
      <parameter name="@level" layout="${level}" />
      <parameter name="@message" layout="${message}" />
      <parameter name="@username" layout="${identity}" />
      <parameter name="@url" layout="${aspnet-request:serverVariable=HTTP_URL}${aspnet-request:queryString}" />
      <parameter name="@remoteAddress" layout="${aspnet-request:serverVariable=REMOTE_ADDR}:${aspnet-request:serverVariable=REMOTE_PORT}" />
      <parameter name="@logger" layout="${logger}" />
      <parameter name="@callSite" layout="${callsite}" />
      <parameter name="@exception" layout="${exception:format=tostring}" />
      <parameter name="@stacktrace" layout="${stacktrace:format=DetailedFlat}" />
    </target>
  </targets>
  <rules>
    <logger name="*" writeTo="database" />
  </rules>
</nlog>

内部记录器工作正常,但普通记录器工作不正常。我在配置中遗漏了什么?

您还需要在C#中注册NLog.Web,这是
${aspnet request}
等所必需的

var extensionAssembly = Assembly.LoadFrom("nlog.web");
ConfigurationItemFactory.Default.RegisterItemsFromAssembly(extensionAssembly);
使用XML配置文件时,将使用自动加载(尚未在.NET Core中)


此问题也应在内部日志中可见

至于我理解的NLog的源代码,如果在
LoggingRule
的构造中没有提供最低日志级别,
LogLevel.Trace
将不会用作最低日志级别。但我希望它会。实际上,这似乎是源代码中的一个bug:没有
启用loggingforlevels
调用()。因此,我的问题的解决方法只是构造函数中的一个参数:

var rule = new LoggingRule("*", LogLevel.Trace, dbTarget);
而不是

var rule = new LoggingRule("*", dbTarget);
现在,所有异常都将被记录,代码工作正常

var rule = new LoggingRule("*", dbTarget);