天天看點

Asp.Net Core NLog 将日志輸出到資料庫以及添加LayoutRenderer的支援

        在這之前打算用Apache的Log4Net,但是發現其AdoNetAppender方法已經不存在了,無法使用配置檔案直接輸出到資料庫了,是以我便改用了NLog架構。

        一、對項目添加NLog

通過Nuget安裝NLog NLog.Extensions.Logging、NLog.Web.AspNetCore
Asp.Net Core NLog 将日志輸出到資料庫以及添加LayoutRenderer的支援

       二、對NLog.config進行配置

     項目中添加NLog.config配置檔案

Asp.Net Core NLog 将日志輸出到資料庫以及添加LayoutRenderer的支援

<?xml version="1.0" encoding="utf-8"?>

<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"

      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

       autoReload="true"

       internalLogLevel="Trace"

       internalLogFile="internal-nlog.txt">

  <!-- define various log targets -->

   <targets>

    <!-- write logs to file -->

     <target xsi:type="File" name="allfile" fileName="${var:configDir}\nlog-all.log"

             layout="${longdate}|${event-properties:item=EventId.Id}|${logger}|${uppercase:${level}}|${message} ${exception}"/>

    <target xsi:type="File" name="ownFile-web" fileName="${var:configDir}\nlog-own.log"

             layout="${longdate}|${event-properties:item=EventId.Id}|${logger}|${uppercase:${level}}|  ${message} ${exception} " />

    <target xsi:type="Null" name="blackhole" />

   <target name="database" xsi:type="Database">

       <connectionString>${var:connectionString}</connectionString>

       <commandText>

         INSERT INTO [dbo].[System_SqlLog]

         ([SqlLogId]

         ,[CreateUserId]

         ,[CreateUserCode]

         ,[CreateUserName]

         ,[CreateTime]

         ,[OperateSql]

         ,[EndDateTime]

         ,[ElapsedTime]

         ,[Parameter])

         VALUES

         (@SqlLogId

         ,@CreateUserId

         ,@CreateUserCode

         ,@CreateUserName

         ,@CreateTime

         ,@OperateSql

         ,@EndDateTime

         ,@ElapsedTime

         ,@Parameter);

       </commandText>

       <parameter name="@SqlLogId" layout="${event-context:item=SqlLogId}"/>

       <parameter name="@CreateUserId" layout="${event-context:item=CreateUserId}" />

       <parameter name="@CreateUserCode" layout="${event-context:item=CreateUserCode}"/>

       <parameter name="@CreateUserName" layout="${event-context:item=CreateUserName}"/>

       <parameter name="@CreateTime" layout="${event-context:item=CreateTime}"/>

       <parameter name="@OperateSql" layout="${event-context:item=OperateSql}" />

       <parameter name="@EndDateTime" layout="${event-context:item=EndDateTime}" />

       <parameter name="@ElapsedTime" layout="${event-context:item=ElapsedTime}" />

       <parameter name="@Parameter" layout="${event-context:item=Parameter}" />

     </target>

  </targets>

   <rules>

    <!--All logs, including from Microsoft-->

     <logger name="*" minlevel="Trace" writeTo="allfile" />

    <!--Skip Microsoft logs and so log only own logs-->

    <logger name="Microsoft.*" minlevel="Trace" writeTo="blackhole" final="true" />

     <logger name="SqlLogToDatabase" minlevel="Debug" writeTo="database" />

    <logger name="*" minlevel="Trace" writeTo="ownFile-web" />

   </rules>

</nlog>

Asp.Net Core NLog 将日志輸出到資料庫以及添加LayoutRenderer的支援
  • Nlog節點如果設定 InternalLogLevel,internalLogFile 可以檢視NLog輸出日志時的内部資訊,并且可以再裡面檢查配置檔案錯誤等。
  • database target内可以指定connectionString,Sql語句,Sql參數等

         三、添加NLog到 .Net Core中

Asp.Net Core NLog 将日志輸出到資料庫以及添加LayoutRenderer的支援
Asp.Net Core NLog 将日志輸出到資料庫以及添加LayoutRenderer的支援

       四、執行

Asp.Net Core NLog 将日志輸出到資料庫以及添加LayoutRenderer的支援

public virtual void WriteLog() {

            Logger iLog = LogManager.GetCurrentClassLogger();

            if (iLog.IsInfoEnabled) {

                LogEventInfo ei = new LogEventInfo(NLog.LogLevel.Info, "", "");

                ei.Properties["SqlLogId"] = CombUtil.NewComb();

                iLog.Info(ei);

            }

        }

Asp.Net Core NLog 将日志輸出到資料庫以及添加LayoutRenderer的支援

     這樣便可以将定義的值添加到資料庫中。

      五、LayoutRenderer的應用

     根據上面的操作并滿足不了我目前架構的應用,我所需要的是直接傳對象,但是直接iLog.Info(T);并不會擷取到值,他會擷取到空值。

在這裡操作的話就得需要自定義LayoutRenderer。

Asp.Net Core NLog 将日志輸出到資料庫以及添加LayoutRenderer的支援

    這個我們可以看出他是一個泛型方法,是以往裡面插入對象是可行的。下面我說一下怎麼重寫LayoutRenderer。直接上代碼

Asp.Net Core NLog 将日志輸出到資料庫以及添加LayoutRenderer的支援

Append會傳回一個資料給目前調用者。然後我們再修改一下配置檔案NLog.config。

Asp.Net Core NLog 将日志輸出到資料庫以及添加LayoutRenderer的支援

并且我們還需要加載此程式集

Asp.Net Core NLog 将日志輸出到資料庫以及添加LayoutRenderer的支援

這樣就會将對應的值插入到我們的資料庫中了。

  1. <targets/>定義日志的目标/輸出
    1. type - 目标的類型 - 比如“File”,“Database”,“Mail”。如果你使用了名字空間,這個屬性會被命名為 xsi:type.
  2. <rules /> - 定義日志的路由規則
  3. <extensions /> - 從*.dll加載NLog擴充
  4. <include /> - 導入外部配置檔案
  5. <variable /> - 為配置變量指派