NLog寫入Mongo日誌配置

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"
    }
相關文章
相關標籤/搜索