.net core 2.x - 日誌 - to elasiticsearch

記錄日誌到elasticsearch(es),下面簡寫es,而後咱們能夠經過kibana可視化的觀察日誌信息以及統計分析等.git

1.起源

  年中旬時候,公司有個需求是須要分析用戶的地址,須要先分詞處理而後經過搜索引擎匹配相關數據,固然這個不是這裏說的重點,主題仍是日誌 to es,也就是日誌傳入es,這裏咱們仍是藉助開源的做品,感謝提供者.github

2.使用參考

項目根目錄新增nlog.config文件,配置內容以下:web

<?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,參考以下:api

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} 配置的loggerapp

NLog記錄等級
  Trace - 最多見的記錄信息,通常用於普通輸出 Debug - 一樣是記錄信息,不過出現的頻率要比Trace少一些,通常用來調試程序 Info - 信息類型的消息 Warn - 警告信息,通常用於比較重要的場合 Error - 錯誤信息 Fatal - 致命異常信息。通常來說,發生致命異常以後程序將沒法繼續執行。 自上而下,等級遞增。cors

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,後者是當前命名空間+點+當前類名 如類比較多,而且往同一個日誌文件記錄,建議用GetCurrentClassLoggerelasticsearch

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=「XXXX@XX.com,XXXXX@XX.com」收件郵箱 多個以逗號分隔 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

相關文章
相關標籤/搜索