ELK +Nlog 分佈式日誌系統的搭建 For Windows

前言html

咱們爲啥須要全文搜索nginx

首先,咱們來列舉一下關係型數據庫中的幾種模糊查詢 web

MySql :sql

  1. 通常狀況下LIKE 模糊查詢  SELECT * FROM `LhzxUsers` WHERE UserName LIKE '%o%'
  2. 模糊查詢高效的方法 

    LOCATE('substr',str,pos)方法  SELECT * FROM `LhzxUsers` WHERE LOCATE('O',UserName) >0

    解釋:返回 substr 在 str 中第一次出現的位置,若是 substr 在 str 中不存在,返回值爲 0 。若是pos存在,返回 substr 在 str 第pos個位置後第一次出現的位置,若是 substr 在 str 中不存在,返回值爲0

    POSITION('substr' IN `field`)方法 SELECT * FROM `LhzxUsers` WHERE POSITION('O' IN UserName)

    解釋:其實咱們就能夠把這個方法當作是locate()方法的別名,由於它和locate()方法的做用是同樣的。

    INSTR(`str`,'substr')方法 SELECT * FROM `LhzxUsers` WHERE INSTR(UserName,'O')>0

    解釋:這個函數返回字符串在某一個字段的內容中的位置, 沒有找到字符串返回0,不然返回位置(從1開始)

    除了上述的方法外,還有一個函數FIND_IN_SET,這個方法比較特殊,他所查詢的必需要是以「,」分隔開。

    FIND_IN_SET(str1,str2) SELECT * FROM LhzxUsers WHERE  FIND_IN_SET('杭州',Address)   

     

 SqlServer 也有相似的函數提供模糊查詢,不重複說明數據庫

思考:使用關係型數據庫咱們如何實現相似,淘寶、京東、的搜索框json

有同窗就舉例了,分詞,sql 拼接,多線程異步執行 ,當你看到這樣的產品屬性時,你還有慾望sql拼接嗎?windows

能夠想象一下公司的業務場景,汽車金融領域,是否是也能夠作一個這樣的搜索,供咱們的業務部門使用,而不是僅僅從特定的幾個字段來進行搜索api

------華麗分割---------瀏覽器

從搜索在談到日誌,咱們有  log4j、Log4j二、nlog、等等系列開源日誌軟件,初期咱們寫入txt,後期,每個月要清理高達幾百G的日誌文件。tomcat

咱們運行的服務器集羣出現 CPU100%,內存溢出等異常,須要查看 IIS、nginx、Apache、tomcat、等服務軟件的運行日誌時,須要一臺一臺的去服務器各個軟件日誌目錄去查看,這個時候就有工程師想到了分佈式日誌服務架構。很優秀!!

基礎軟件環境搭建

ELK由ElasticSearch(ES)、Logstash和Kiabana三個開源工具組成。

  • elasticsearch-6.3.2
  • kibana-6.3.2-windows-x86_64
  • logstash-6.3.2
  • nssm工具能夠將各類應用添加到Windows服務,以服務的形式運行上訴軟件 官網 http://nssm.cc/
  • ES是個開源分佈式搜索引擎,它的特色有:分佈式,零配置,自動發現,索引自動分片,索引副本機制,restful風格接口,多數據源,自動搜索負載等。 這裏有權威指南 https://es.xiaoleilu.com
  • Logstash是一個徹底開源的工具,能夠對日誌進行收集、分析、並將其存儲供之後使用。
  • Filebeat隸屬於Beats。目前Beats包含四種工具:(此文只會談及

      1. Packetbeat(蒐集網絡流量數據)
      2. Topbeat(蒐集系統、進程和文件系統級別的 CPU 和內存使用狀況等數據)
      3. Filebeat(蒐集文件數據)
      4. Winlogbeat(蒐集 Windows 事件日誌數據)
  • kibana也是一個開源和免費的工具,他Kibana能夠爲Logstash和ES提供的日誌分析友好的Web界面,能夠幫助您彙總、分析和搜索重要數據日誌。

 

image

1:安裝JAVA-JDK(須要1.8),官方自行下載,不作介紹

2:安裝ES服務

    • 進入目錄C:\ELK\elasticsearch-6.5.3\bin, 雙擊執行 elasticsearch.bat,該腳本文件執行 ElasticSearch 安裝程序,稍等片刻,打開瀏覽器,輸入 http://localhost:9200 ,顯式如下畫面,說明ES安裝成功。
    • 關閉命令提示符窗口,服務也中止了,咱們使用nssm工具將其安裝爲服務運行,cmd 進入nssm.exe 目錄 輸入nssm.exe install 回車,此時會彈出nssm工具的ui界面
    • image
    • 選擇 C:\ELK\elasticsearch-6.5.3\bin\elasticsearch.bat 輸入服務名稱 elasticsearch-6.5.3 點擊install service
    • image
    • 天公不做美,安裝時出現了意外,百度半天,發現是360 安全防禦在做怪
    • image
    • 若是所示,被360 防禦中心攔截,隨手就卸載了360
    • image
    • 果真再次點擊安裝,成功
    • image
    • 因爲咱們在安裝服務時,將DisplayName 隨手寫成了AAA
    • image
    • 因此在安裝好的服務列表中顯示的是AAA ,描述爲BBB
    • image
    • 啓動服務,而後再瀏覽器裏面輸入 http://localhost:9200/
    • image
    • 看到這個界面,說明elasticsearch啓動成功
    • 如今咱們來配置下elasticsearch 讓它能夠用IPV4 來訪問
    • 進入 根目錄 C:\ELK\elasticsearch-6.5.3\config 找到 elasticsearch.yml 配置文件
    • 有關 elasticsearch.yml 的詳細配置參考園友的詳細介紹: http://www.javashuo.com/article/p-hbhfrjld-gd.html
    • 找到 Network 配置位置
    • image
    • 取消這兩行的註釋  刪除最前面的 #
    • 把 network.host 換成安裝elasticsearch本機的IP ,端口號能夠默認,而後保存,重啓服務
    • 隨即咱們在 瀏覽器中 就可使用 IP 來訪問
    • image
    • 在這裏 elasticsearch 的單機簡易安裝服務咱們完成了 ,關於elasticsearch的集羣服務安裝能夠後續繼續研究。

3:安裝Logstash服務

 

Logstash 它的五種替代方案(Filebeat、Fluentd、rsyslog、syslog-ng 以及 Logagent)

Logstash工做原理:
Logstash事件處理有三個階段:inputs → filters → outputs。是一個接收,處理,轉發日誌的工具。支持系統日誌,webserver日誌,錯誤日誌,應用日誌,總之包括全部能夠拋出來的日誌類型。

 

這裏我不去分析這五種日誌收集傳輸工具的優缺點,有興趣的同窗能夠自行去研究他們的優劣勢以及使用場景。

    • 在根目錄新增 logstash.conf 配置文件

input {
    stdin{

    }
    udp{
        host=>"192.168.100.48"
        port=>4561
        codec=>"json"
    }
}
filter {
}   
output {
  elasticsearch {
        hosts => ["192.168.100.48:9200"]
        index => "logstash-%{+YYYY.MM.dd}"
        document_type => "logs"
  }
  stdout {}
}

     
  • 同理,使用NSSM 安裝 Logstash
  • image
  • 注意,安裝Logstash 時須要選擇配置文件安裝 添加啓動參數 agent -f C:\ELK\logstash-6.3.2\bin\logstash.conf
  • image
  • 如圖,安裝服務後 啓動服務
  • image
  • 在啓動的時候若是報錯或者閃退 未能加載主程序XXXXXX
  • bin 文件夾下找到 logstash.bat 文件,打開 image 在這一行的這兩個位置加上雙引號
  • 再次運行,OK

4:安裝 kibana-6.3.2

  • 進入跟目錄 C:\ELK\kibana-6.3.2-windows-x86_64\kibana-6.3.2-windows-x86_64\config
  • 編輯 kibana.yml
  • image
  • 使用NSSM 安裝 kibana 爲服務
  • 右鍵啓用,瀏覽器訪問 http://192.168.100.48:5601 就能夠打開 kibana 界面了
  • image

這ELK樣服務安裝完成後,咱們就能夠開始往裏面寫入各類數據了

首先來看下在Net Core 中使用 Nlog 向搭建好的 ELK 輸入日誌

  1. 建立一個netcore api 項目
  2. 打開NuGet包管理器 搜索 NLog.Web.AspNetCore
  3. 安裝如圖中的兩個包 image
  4. 在 Startup.cs 中 配置使用 Nlog image
  5. 新增 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="Warn"
           internalLogFile="internal-nlog.txt">
        <!--define various log targets-->
        <targets>
            <target name="network" xsi:type="Network" address="udp://192.168.100.48:4561" layout="${message}"/>
        </targets>
        <rules>
            <logger name="*" level="Info" writeTo="network" />
        </rules>
    </nlog>
  6. 新增 JsonLogMessage 類
    public class JsonLogMessage
        {
            public string A_Message { get; set; }
            public int A_AddUser { get; set; }
            public string A_AddUserName { get; set; }
            public int A_ObjId { get; set; }
            public string A_ObjName { get; set; }
            public string A_OperationName { get; set; }
            public string A_ActionName { get; set; }
            public string A_Host { get; set; }
            public string S_LoggerName { get; set; }
            public string S_Level { get; set; }
            public string S_Thread { get; set; }
            public string S_Application { get; set; }
            public DateTime S_Timestamp { get=> System.DateTime.Now;}
        }
  7. 在控制器中使用 Nlog 向ELK 輸出 日誌
    [Route("api/[controller]")]
        [ApiController]
        public class ValuesController : ControllerBase
        {
            private readonly ILogger _Logger = LogManager.GetCurrentClassLogger();
    
            // GET api/values
            [HttpGet]
            public ActionResult<IEnumerable<string>> Get()
            {
                for (int i = 0; i < 100; i++)
                {
    
                    JsonLogMessage jsonLogMessage = new JsonLogMessage()
                    {
                        A_ActionName = "Get",
                        A_AddUser = 1,
                        A_AddUserName = "張三",
                        A_Host = "192.168.100.48",
                        A_Message = string.Format("測試Logstash日誌請求,請求id:{0}", i),
                        A_ObjId = 2,
                        A_ObjName = "操做對象",
                        A_OperationName = "獲取對象",
                        S_Application = "S_Application"
                    };
                    _Logger.Info(Newtonsoft.Json.JsonConvert.SerializeObject(jsonLogMessage));
                }
                return new string[] { "value1", "value2" };
            }
    }
  8. 打開 Kibana 建立 索引庫image
  9. 建立完畢後,你就能在 Discover 看到 咱們輸入的日誌了image

到這裏 一個 以Nlog + ELK 的分佈式日誌系統就搭建完成了,有同窗問,這樣就行了麼?,我在這裏給你們一張拓撲圖,你們看了就明白了,這上面作的只是入門的基礎單元

網絡截圖

image

 網絡截圖

 網絡截圖

 

 

 

 

拓展:也有nlog 直接寫入 參考園友文章,有興趣的同窗能夠試一下

https://www.cnblogs.com/focus-lei/p/9154867.html

若是隻是爲了寫日誌,這樣也不失爲一個簡便的方法,但你若是須要對收集到的各類日誌進行格式化,過濾,此方式就不通了。

期待下篇,goodbye ~

相關文章
相關標籤/搜索