1. 程式人生 > >net core 2.x - 日誌 - to elasiticsearch

net core 2.x - 日誌 - to elasiticsearch

記錄日誌到elasticsearch(es),下面簡寫es,然後我們可以通過kibana視覺化的觀察日誌資訊以及統計分析等.

1.起源

  年中旬時候,公司有個需求是需要分析使用者的地址,需要先分詞處理然後通過搜尋引擎匹配相關資料,當然這個不是這裡說的重點,主題還是日誌 to es,也就是日誌傳入es,這裡我們還是藉助開源的作品,感謝提供者.

2.使用參考

專案根目錄新增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" internalLogToConsole="true"> <extensions> <add assembly="NLog.Targets.ElasticSearch"/> </extensions> <targets> <!--ElasticSearch儲存日誌資訊--> <target name="ElasticSearch" xsi:type="ElasticSearch
" ConnectionStringName="ElasticSearchServerAddress" index="userapi-${date:format=yyyy.MM.dd}" documentType="doc" includeAllProperties="true" layout="[${date:format=yyyy-MM-dd HH\:mm\:ss}][${level}] ${logger} ${message} ${exception:format=toString}"> <field name="
MachineName" layout="${machinename}" /> <field name="Time" layout="${longdate}" /> <field name="level" layout="${level:uppercase=true}" /> <field name="logger" layout=" ${logger}" /> <field name="message" layout=" ${message}" /> <field name="exception" layout=" ${exception:format=toString}" /> <field name="processid" layout=" ${processid}" /> <field name="threadname" layout=" ${threadname}" /> <field name="stacktrace" layout=" ${stacktrace}" /> <field name="Properties" layout=" ${machinename} ${longdate} ${level:uppercase=true} ${logger} ${message} ${exception}|${processid}|${stacktrace}|${threadname}" /> </target> </targets> <rules> <logger name="*" minlevel="INFO" writeTo="ElasticSearch" /> </rules> </nlog>
View Code

同時在 startup.cs中的configure方法中注入 IHostingEnvironment env物件,通過 env配置nlog,參考如下:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseCors("cors");
            loggerFactory.AddNLog();
            env.ConfigureNLog("nlog.config");
            app.UseMvc();
        }

這裡需要新增nlog同時指定我們自定義的nlog.config的配置檔案,這樣就完了.這時候會報錯,因為少了檔案,也就是一個第三方的資源包

 

3.使用到的資源

使用nuget匯入對應的binary物件 nuget: install-package NLog.Targets.ElasticSearch,,這裡的相關配置說明如下:
<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">
  xmlns=“http://www.nlog-project.org/schemas/NLog.xsd” 這表示預設名稱空間;xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 這個名稱空間裡面的元素或者屬性就必須要以xsi:這種方式來寫 比如schemaLocation就是他的一個屬性,所以寫成xsi:schemaLocation 而預設名稱空間不帶類似xsi這種,其實xml標籤名稱有個專業叫法叫做QName,而如果沒有前面的xsi:這種一般叫做NCName xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd" 表示把定義這個名稱空間的schema檔案給引用進來,好讓開發型別工具能夠解析和驗證你的xml檔案是否符合語法規範 等同於
簡單來說 上面是用來驗證你XML格式是否正確的。
  InternalLogFile="c:\log\nlog.txt" //NLog內部日誌檔案位置 internalLogLevel="Debug" //日誌級別 autoReload:一旦啟動程式,這時候NLog.config檔案被讀取後,知道程式再啟動都不會再讀取配置檔案了。假如我們不想停掉程式,比如說伺服器哪能說停就停哈。這就用上這個配置了,這個配置功能是,一旦你對配置檔案修改,程式將會重新讀取配置檔案,也就是自動再配置。
  throwExceptions//NLog日誌系統丟擲異常 internalLogFile="c:\log\nlog.txt" //NLog內部日誌檔案位置 internalLogLevel="Debug" //日誌級別- 定義配置檔案中用到的變數 - 定義日誌的目標/輸出 - 定義日誌的路由規則

Layout佈局
  幾種常見的 ${var:basePath} basePath是前面自定義的變數 ${longdate} 日期格式 2017-01-17 16:58:03.8667 ${shortdate}日期格式 2017-01-17 ${date:yyyyMMddHHmmssFFF} 日期 20170117165803866 ${message} 輸出內容 ${guid} guid ${level}日誌記錄的等級 ${logger} 配置的logger

NLog記錄等級
  Trace - 最常見的記錄資訊,一般用於普通輸出 Debug - 同樣是記錄資訊,不過出現的頻率要比Trace少一些,一般用來除錯程式 Info - 資訊型別的訊息 Warn - 警告資訊,一般用於比較重要的場合 Error - 錯誤資訊 Fatal - 致命異常資訊。一般來講,發生致命異常之後程式將無法繼續執行。 自上而下,等級遞增。

NLog等級使用
  指定特定等級 如:level="Warn" 指定多個等級 如:levels=“Warn,Debug“ 以逗號隔開 指定等級範圍 如:minlevel="Warn" maxlevel="Error"

Logger使用
從配置檔案讀取資訊並初始化 兩種常用的方式
  根據配置的路由名獲生成特定的logger Logger logger = LogManager.GetLogger("LoggerDemo");
  初始化為當前名稱空間下當前類的logger Logger logger = LogManager.GetCurrentClassLogger();
  區別是logger的name不一樣 前者是LoggerDemo,後者是當前名稱空間+點+當前類名 如類比較多,並且往同一個日誌檔案記錄,建議用GetCurrentClassLogger

Logger有以下三種常用的寫入方式
  logger.Error("這是DatabaseDemo的錯誤資訊"); logger.Error(“ContentDemo {0}:{1}”,“時間”,DateTime.Now.ToString());需要拼接字串的話推薦這種,NLog做了延遲處理,用的時候才拼接。 logger.Log(LogLevel.Error, "這是ContentDemo");

Logger發郵件引數
  smtpServer=“” 郵件伺服器 例如126郵箱是smtp.126.com smtpPort=“25“埠 smtpAuthentication=“Basic“ 身份驗證方式 基本 smtpUserName=““ 郵件伺服器使用者名稱 smtpPassword=“**”郵件伺服器密碼 enableSsl=“false”是否使用安全連線 需要伺服器支援 addNewLines=“true” 開頭與結尾是否換行 from=“” 發件郵箱 to=“[email protected],[email protected]”收件郵箱 多個以逗號分隔 subject=“subject:${machinename}報錯“ 郵件主題 header=“---------------------開頭-------------------------“ 郵件開頭 body=“${newline}${message}${newline}“ 郵件內容 footer=“---------------------結尾-------------------------“ 郵件結尾

ABP 開源框架中配置參考

<!--write logs to file-->

<target xsi:type="File" name="allfile" fileName="${logDirectory}\nlog-all-${shortdate}.log"
             layout="${longdate}|${logger}|${uppercase:${level}}|${message} ${exception}" />

<target xsi:type="File" name="ownFile-web" fileName="nlog-my-${shortdate}.log"
             layout="${longdate}|${logger}|${uppercase:${level}}|${message} ${exception}" />

<target xsi:type="Null" name="blackhole" />
<!--Skip Microsoft logs and so log only own logs-->
<logger name="Microsoft.*" minlevel="Trace" writeTo="blackhole" final="true" />
<logger name="*" minlevel="Trace" writeTo="ownFile-web" />

 

資源地址:

通過nuget gallery查詢獲取:

https://www.nuget.org/packages?q=NLog.Targets.ElasticSearch

通過igthub獲取:

https://github.com/markmcdowell/NLog.Targets.ElasticSearch