Web網站中引入了NLog日誌,日誌記錄在Mongo數據庫中,通過兩天的簡單學習,現簡要記錄說明下:git
首先貼出NLog的學習地址: https://github.com/NLog/NLog/wiki/Tutorial ,使用的NLog版本爲:4.5+github
以及這次項目中的NLog配置文檔 :(NLog.Config)mongodb
<?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" xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd" autoReload="true" throwExceptions="false" internalLogLevel="Off" internalLogFile="c:\temp\nlog-internal.log"> <extensions> <add assembly="NLog.Mongo"/> <add assembly="NLog.Web"/> </extensions> <targets> <target xsi:type="Mongo" name="mongoDefault" connectionString="mongodb://192.168.106.56/MongoDB" collectionName="SysErrorLog" cappedCollectionSize="26214400"> <field name="Date" layout="${longdate}"/> <property name="RequestIP" layout="${aspnet-request-ip}" /> <property name="UserName" layout="$UserName" /> <property name="BaseDir" layout="${aspnet-appbasepath}"/> <property name="QueryUrl" layout="${aspnet-request-url}"/> <property name="Method" layout="${aspnet-request-method}"/> <property name="Controller" layout="${aspnet-mvc-controller}"/> <property name="Action" layout="${aspnet-mvc-action}" /> <property name="FormContent" layout="${aspnet-request-form}"/> <property name="QueryContent" layout="${aspnet-request-querystring}"/> </target> </targets> <rules> <logger name="*" minlevel="Info" maxlevel="Fatal" writeTo="mongoDefault"/> </rules> </nlog>
相關節點的說明:數據庫
<target> 日誌輸出目標。目前NLog支持八十餘種輸出,如控制檯,郵件,窗體,數據庫等。具體支持的目標,可參考 這裏 。一個<targets>中能夠配置多個<target>輸出。
mvc
一、target屬性中標記了當前 target 的名稱以及要輸出到相關MongoDB的配置。app
二、<field>指定 document中的根字段,name 對應的根節點名稱,layout 對應輸出值ide
三、<property> 指定 document中的properties節點中的子節點,name 對應的根節點名稱,layout 對應輸出值學習
四、不一樣的應用中,NLog能獲取的系統參數能夠看 這裏 。網站
<rules> 指定 loger 的輸出目標,即指定 logger 使用哪一個 target 進行輸出日誌。本節配置指定最小級別爲Info,最高級別爲Fatal,並使用名稱爲 "mongoDefault" 的 target。url
<extensions> NLog使用的擴展庫。
由上邊兩個圖知道,咱們使用的MongoDB配置引用了 NLog.Mongo 動態庫。layout中使用獲取的 Web 參數使用了 NLog.Web動態庫。不只要在Nuget上獲取這兩個動態庫,還應該在配置中引入。
關於日誌中加入用戶參數的使用說明:
public static void Error(Exception ex)
{
Logger logger = LogManager.GetCurrentClassLogger();
var UserName = Config.Identity?.Name ?? "";
var Target = ex.TargetSite.Name ?? "";
var parms = ex.Data?.ToDictionary().Select(k => k.Key + "=" + k.Value).Join() ?? "";
LogEventInfo theEvent = new LogEventInfo(); theEvent.Exception = ex; theEvent.Message = ex.Message; theEvent.Properties["Target"] = Target; theEvent.Properties["Parameters"] = parms; theEvent.Properties["UserName"] = UserName; logger.Error(theEvent);
}
使用LogEventInfo寫入自定義參數。本節中,將用戶自定義的參數都放入到document的Properties節點中。
注:若是對應的節點值爲空,則NLog不會寫入該節點。
程序調用代碼:
try { throw new DivideByZeroException("Opps"); } catch (Exception e) { e.Data.Add(nameof(a),a); e.Data.Add(nameof(b), b); Error(e); }
輸入日誌格式以下:
"_id" : ObjectId("5c8867288d14af392479e58f"), "Date" : "2019-03-13 10:12:56.5343", "Level" : "Error", "Logger" : "Test.Web.Window.LogHelper", "Message" : "Opps", "Exception" : { "Message" : "Opps", "BaseMessage" : "Opps", "Text" : "System.DivideByZeroException: Opps\r\n 在 Test.Web.Window.Controllers.TestController.Divid(Double a, Double b) 位置 D:\\Projects\\Common\\Test.Web\\Test.Web\\Test.Web.Window\\Controllers\\TestController.cs:行號 35", "Type" : "System.DivideByZeroException", "HResult" : -2147352558, "Source" : "Test.Web.Window", "MethodName" : "Divid", "ModuleName" : "Test.Web.Window", "ModuleVersion" : "1.0.0.0" }, "Properties" : { "RequestIP" : "::1", "UserName" : "admin", "BaseDir" : "D:\\Projects\\Common\\Test.Web\\Test.Web\\Test.Web.Window\\", "QueryUrl" : "http://localhost/test/index", "Method" : "GET", "Controller" : "test", "Action" : "index", "Target" : "Divid", "Parameters" : "a=5,b=0" }