繁体   English   中英

以编程方式配置NLog

[英]Configuring NLog programmatically

我有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>

而且效果很好。 但是现在我需要以编程方式配置NLog。 所以我尝试

var config = new LoggingConfiguration();
var dbTarget = new DatabaseTarget {
    ConnectionString = connectionString,
    DBProvider = "sqlserver",
    Name = "database",
    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
        );"
};
dbTarget.Parameters.Add(new DatabaseParameterInfo("@logged", "${date}"));
dbTarget.Parameters.Add(new DatabaseParameterInfo("@level", "${level}"));
dbTarget.Parameters.Add(new DatabaseParameterInfo("@message", "${message}"));
dbTarget.Parameters.Add(new DatabaseParameterInfo("@username", "${identity}"));
dbTarget.Parameters.Add(new DatabaseParameterInfo("@url", "${aspnet-request:serverVariable=HTTP_URL}${aspnet-request:queryString}"));
dbTarget.Parameters.Add(new DatabaseParameterInfo("@remoteAddress", "${aspnet-request:serverVariable=REMOTE_ADDR}:${aspnet-request:serverVariable=REMOTE_PORT}"));
dbTarget.Parameters.Add(new DatabaseParameterInfo("@logger", "${logger}"));
dbTarget.Parameters.Add(new DatabaseParameterInfo("@callSite", "${callsite}"));
dbTarget.Parameters.Add(new DatabaseParameterInfo("@exception", "${exception:format=tostring}"));
dbTarget.Parameters.Add(new DatabaseParameterInfo("@stacktrace", "${stacktrace:format=DetailedFlat}"));
config.AddTarget("database", dbTarget);
var rule = new LoggingRule("*", dbTarget);
config.LoggingRules.Add(rule);
LogManager.Configuration = config;
InternalLogger.LogFile = internalLogFile;

内部记录器可以正常工作,但普通记录器则不能。 我在配置中错过了什么?

据我了解NLog的源代码,如果您未在LoggingRule的结构中提供最低日志级别,则LogLevel.Trace将不会用作最低日志级别。 但是我希望它会。 实际上,似乎是源代码中的错误:没有EnableLoggingForLevels调用( 所有LoggingRule都有EnableLoggingForLevels调用,但这是 )。 因此,解决我的问题只是构造函数中的一个参数:

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

代替

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

现在将记录所有异常,并且代码可以正常工作。

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

var extensionAssembly = Assembly.LoadFrom("nlog.web");
ConfigurationItemFactory.Default.RegisterItemsFromAssembly(extensionAssembly);

使用XML配置文件时,将使用自动加载功能(.NET Core中尚未提供)。

内部日志中也应该显示此问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM