1. 程式人生 > >Asp.Net Core NLog 將日誌輸出到數據庫以及添加LayoutRenderer的支持

Asp.Net Core NLog 將日誌輸出到數據庫以及添加LayoutRenderer的支持

tab 發現 exce images tex system 規則 .net pan

在這之前打算用Apache的Log4Net,但是發現其AdoNetAppender方法已經不存在了,無法使用配置文件直接輸出到數據庫了,因此我便改用了NLog框架。

一、對項目添加NLog

通過Nuget安裝NLog NLog.Extensions.LoggingNLog.Web.AspNetCore 技術分享圖片

二、對NLog.config進行配置

項目中添加NLog.config配置文件 技術分享圖片

<?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>

技術分享圖片
  • Nlog節點如果設置 InternalLogLevel,internalLogFile 可以查看NLog輸出日誌時的內部信息,並且可以再裏面檢查配置文件錯誤等。
  • database target內可以指定connectionString,Sql語句,Sql參數等

三、添加NLog到 .Net Core中

技術分享圖片 技術分享圖片

四、執行

技術分享圖片

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);
}
}

技術分享圖片 這樣便可以將定義的值添加到數據庫中。

五、LayoutRenderer的應用

根據上面的操作並滿足不了我當前框架的應用,我所需要的是直接傳對象,但是直接iLog.Info(T);並不會獲取到值,他會獲取到空值。 在這裏操作的話就得需要自定義LayoutRenderer。 技術分享圖片 這個我們可以看出他是一個泛型方法,所以往裏面插入對象是可行的。下面我說一下怎麽重寫LayoutRenderer。直接上代碼 技術分享圖片 Append會返回一個數據給當前調用者。然後我們再修改一下配置文件NLog.config。 技術分享圖片 並且我們還需要加載此程序集 技術分享圖片 這樣就會將對應的值插入到我們的數據庫中了。
  1. <targets/>定義日誌的目標/輸出
    1. type - 目標的類型 - 比如“File”,“Database”,“Mail”。如果你使用了名字空間,這個屬性會被命名為 xsi:type.
  2. <rules /> - 定義日誌的路由規則
  3. <extensions /> - 從*.dll加載NLog擴展
  4. <include /> - 導入外部配置文件
  5. <variable /> - 為配置變量賦值

Asp.Net Core NLog 將日誌輸出到數據庫以及添加LayoutRenderer的支持