NET标准2.0的nlog数据库渲染器

时间:2018-06-19 16:11:12

标签: database logging nlog .net-standard-2.0

嗨,我正在尝试在.NET标准2.0项目中使用nlog实现数据库日志记录。

项目中使用的Nutt依赖项:

 - NLog 4.5.6
 - NLog.Config 4.5.6
 - NLog.Extended.Standard 1.0.0
 - NLog.Web.AspNetCore 4.5.4

,但是在行中出现以下异常而失败:

   Logger logger = LogManager.GetLogger("database");

  NLog.NLogConfigurationException
    HResult=0x80131500
    Message=Exception when parsing D:\Development\Workspace\TheMatrix\WFA 
    POC\WFA.Infrastructure.Test\bin\Debug\netcoreapp2.1\NLog.config. 
    Source=NLog
    StackTrace:
     at NLog.Config.XmlLoggingConfiguration.Initialize(XmlReader reader, String 
     fileName, Boolean ignoreErrors)
     at NLog.Config.XmlLoggingConfiguration..ctor(String fileName, Boolean 
     ignoreErrors, LogFactory logFactory)
     at NLog.LogFactory.TryLoadLoggingConfiguration(String configFile)
     at NLog.LogFactory.TryLoadFromFilePaths()
     at NLog.LogFactory.get_Configuration()
     at NLog.LogFactory.GetLogger(LoggerCacheKey cacheKey)
     at NLog.LogFactory.GetLogger(String name)
     at WFA.Infrastructure.Logging.Log.Write(String info) in 
    D:\Development\Workspace\TheMatrix\WFA 
     POC\WFA.Infrastructure\Logging\Log.cs:line 19
     at WFA.Infrastructure.Test.LoggingTest.AddLog() in 
    D:\Development\Workspace\TheMatrix\WFA 
      POC\WFA.Infrastructure.Test\LoggingTest.cs:line 30

    Inner Exception 1:
    NLogConfigurationException: Error when setting property 'Layout' on 
    NLog.Targets.DatabaseParameterInfo

    Inner Exception 2:
     ArgumentException: LayoutRenderer cannot be found: 'appsetting'

以下是我的nlog配置:


  <?xml version="1.0" encoding="utf-8" ?>
    <!-- XSD manual extracted from package NLog.Schema: 
    https://www.nuget.org/packages/NLog.Schema-->
    <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" 
    xsi:schemaLocation="NLog NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      autoReload="true"
      throwExceptions="true"
      internalLogFile="D:\Logs\internal.log"
      internalLogLevel="Info" >

     <!-- the targets to write to -->
     <targets>
     <!-- write logs to file -->
     <target xsi:type="File" name="file" fileName="D:\Logs\test.log"
            layout="${date}|${level:uppercase=true}|${message} 
     ${exception}|${logger}|${all-event-properties}" />


    <target xsi:type="Database"
          name="database"
          dbProvider="System.Data.SqlClient"
          connectionString="Server=DAL0NWMTXDEVD01;Database=WFAPOC;Trusted_Connection=True;"
          keepConnection="True">

      <!-- Script for creating the dbo.Log table.
        SET ANSI_NULLS ON
        SET QUOTED_IDENTIFIER ON
        CREATE TABLE [dbo].[Log] (
            [Id] [int] IDENTITY(1,1) NOT NULL,
            [Application] [nvarchar](50) NOT NULL,
            [Logged] [datetime] NOT NULL,
            [Level] [nvarchar](50) NOT NULL,
            [Message] [nvarchar](max) NOT NULL,
            [UserName] [nvarchar](250) NULL,
            [ServerName] [nvarchar](max) NULL,
            [Port] [nvarchar](max) NULL,
            [Url] [nvarchar](max) NULL,
            [Https] [bit] NULL,
            [ServerAddress] [nvarchar](100) NULL,
            [RemoteAddress] [nvarchar](100) NULL,
            [Logger] [nvarchar](250) NULL,
            [Callsite] [nvarchar](max) NULL,
            [Exception] [nvarchar](max) NULL,
          CONSTRAINT [PK_dbo.Log] PRIMARY KEY CLUSTERED ([Id] ASC)
            WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
        ) ON [PRIMARY]
      -->

      <commandText>
        insert into dbo.Log (Application, Logged, Level, Message, Username, ServerName, Port, Url, Https, ServerAddress, RemoteAddress, Logger, CallSite, Exception) 
          values (@Application, @Logged, @Level, @Message,@Username,@ServerName, @Port, @Url, @Https,@ServerAddress, @RemoteAddress,@Logger, @Callsite, @Exception);
      </commandText>

      <parameter name="@application" layout="${appsetting:name=AppName:default=Unknown}" ></parameter>
      <parameter name="@logged" layout="${date}" />
      <parameter name="@level" layout="${level}" />
      <parameter name="@message" layout="${message}" />

      <parameter name="@username" layout="${identity}" />

      <parameter name="@serverName" layout="${aspnet-request:serverVariable=SERVER_NAME}" />
      <parameter name="@port" layout="${aspnet-request:serverVariable=SERVER_PORT}" />
      <parameter name="@url" layout="${aspnet-request:serverVariable=HTTP_URL}" />
      <parameter name="@https" layout="${when:inner=1:when='${aspnet-request:serverVariable=HTTPS}' == 'on'}${when:inner=0:when='${aspnet-request:serverVariable=HTTPS}' != 'on'}" />

      <parameter name="@serverAddress" layout="${aspnet-request:serverVariable=LOCAL_ADDR}" />
      <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:tostring}" />-->

    </target>

   </targets>

    <!-- rules to map from logger name to target -->
    <rules>
      <logger name="*" minlevel="Trace" writeTo="file" />
     </rules>

   </nlog>

以下是我的App.config


 <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <appSettings>
        <add key="AppName" value="WFAPOC" ></add>
      </appSettings>
    </configuration>

以下是我的示例代码


   LogManager.ThrowExceptions = true;
    Logger logger = LogManager.GetLogger("database");

    logger.Trace("Trace" + info);
    logger.Debug("Debug" + info);
    logger.Info("Info" + info);
    logger.Warn("Warn" + info);
    logger.Error("Error" + info);
    logger.Fatal("Fatal" + info);

1 个答案:

答案 0 :(得分:0)

使用NLog.Extension.Logging版本。 1.4.0,那么您现在可以使用${configsetting}

另请参阅:https://github.com/NLog/NLog/wiki/ConfigSetting-Layout-Renderer