日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Elasticsearch方案管理 Spring Boot 和 Nginx 日志

發布時間:2023/12/20 javascript 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Elasticsearch方案管理 Spring Boot 和 Nginx 日志 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在排查線上異常的過程中,查詢日志總是必不可缺的一部分?,F今大多采用的微服務架構,日志被分散在不同的機器上,使得日志的查詢變得異常困難。工欲善其事,必先利其器。如果此時有一個統一的實時日志分析平臺,那可謂是雪中送碳,必定能夠提高我們排查線上問題的效率。本文帶您了解一下開源的實時日志分析平臺 ELK 的搭建及使用。

ELK 簡介

ELK 是一個開源的實時日志分析平臺,它主要由 Elasticsearch、Logstash 和 Kiabana 三部分組成。

Logstash

Logstash 主要用于收集服務器日志,它是一個開源數據收集引擎,具有實時管道功能。Logstash 可以動態地將來自不同數據源的數據統一起來,并將數據標準化到您所選擇的目的地。

Logstash 收集數據的過程主要分為以下三個部分:

  • 輸入:數據(包含但不限于日志)往往都是以不同的形式、格式存儲在不同的系統中,而 Logstash 支持從多種數據源中收集數據(File、Syslog、MySQL、消息中間件等等)。

  • 過濾器:實時解析和轉換數據,識別已命名的字段以構建結構,并將它們轉換成通用格式。

  • 輸出:Elasticsearch 并非存儲的唯一選擇,Logstash 提供很多輸出選擇。

Elasticsearch

Elasticsearch (ES)是一個分布式的 Restful 風格的搜索和數據分析引擎,它具有以下特點:

  • 查詢:允許執行和合并多種類型的搜索 — 結構化、非結構化、地理位置、度量指標 — 搜索方式隨心而變。

  • 分析:Elasticsearch 聚合讓您能夠從大處著眼,探索數據的趨勢和模式。

  • 速度:很快,可以做到億萬級的數據,毫秒級返回。

  • 可擴展性:可以在筆記本電腦上運行,也可以在承載了 PB 級數據的成百上千臺服務器上運行。

  • 彈性:運行在一個分布式的環境中,從設計之初就考慮到了這一點。

  • 靈活性:具備多個案例場景。支持數字、文本、地理位置、結構化、非結構化,所有的數據類型都歡迎。

Kibana

Kibana 可以使海量數據通俗易懂。它很簡單,基于瀏覽器的界面便于您快速創建和分享動態數據儀表板來追蹤 Elasticsearch 的實時數據變化。其搭建過程也十分簡單,您可以分分鐘完成 Kibana 的安裝并開始探索 Elasticsearch 的索引數據?—?沒有代碼、不需要額外的基礎設施。

對于以上三個組件在 《ELK 協議棧介紹及體系結構》 一文中有具體介紹,這里不再贅述。

在 ELK 中,三大組件的大概工作流程如下圖所示,由 Logstash 從各個服務中采集日志并存放至 Elasticsearch 中,然后再由 Kiabana 從 Elasticsearch 中查詢日志并展示給終端用戶。

圖 1. ELK 的大致工作流程

圖片

ELK 實現方案

通常情況下我們的服務都部署在不同的服務器上,那么如何從多臺服務器上收集日志信息就是一個關鍵點了。本篇文章中提供的解決方案如下圖所示:

圖 2. 本文提供的 ELK 實現方案

圖片

如上圖所示,整個 ELK 的運行流程如下:

  • 在微服務(產生日志的服務)上部署一個 Logstash,作為 Shipper 角色,主要負責對所在機器上的服務產生的日志文件進行數據采集,并將消息推送到 Redis 消息隊列。

  • 另用一臺服務器部署一個 Indexer 角色的 Logstash,主要負責從 Redis 消息隊列中讀取數據,并在 Logstash 管道中經過 Filter 的解析和處理后輸出到 Elasticsearch 集群中存儲。

  • Elasticsearch 主副節點之間數據同步。

  • 單獨一臺服務器部署 Kibana 讀取 Elasticsearch 中的日志數據并展示在 Web 頁面。

  • 通過這張圖,相信您已經大致清楚了我們將要搭建的 ELK 平臺的工作流程,以及所需組件。下面就讓我們一起開始搭建起來吧。

    ELK 平臺搭建

    本節主要介紹搭建 ELK 日志平臺,包括安裝 Indexer 角色的 Logstash,Elasticsearch 以及 Kibana 三個組件。完成本小節,您需要做如下準備:

  • 一臺 Ubuntu 機器或虛擬機,作為入門教程,此處省略了 Elasticsearch 集群的搭建,且將 Logstash(Indexer)、Elasticsearch 以及 Kibana 安裝在同一機器上。

  • 在 Ubuntu 上安裝 JDK,注意 Logstash 要求 JDK 在 1.7 版本以上。

  • Logstash、Elasticsearch、Kibana 安裝包,您可以在 此頁面 下載。

  • 安裝 Logstash

    解壓壓縮包:

    tar?-xzvf?logstash-7.3.0.tar.gz

    顯示更多簡單用例測試,進入到解壓目錄,并啟動一個將控制臺輸入輸出到控制臺的管道。

    cd?logstash-7.3.0 elk@elk:~/elk/logstash-7.3.0$?bin/logstash?-e?'input?{?stdin?{}?}?output?{?{?stdout?{}?}?}'

    顯示更多看到如下日志就意味著 Logstash 啟動成功。

    圖 3. Logstash 啟動成功日志

    圖片

    在控制臺輸入 Hello Logstash ,看到如下效果代表 Logstash 安裝成功。

    清單 1. 驗證 Logstash 是否啟動成功Hello Logstash

    {"@timestamp"?=>?2019-08-10T16:11:10.040Z,"host"?=>?"elk","@version"?=>?"1","message"?=>?"Hello?Logstash" }

    安裝 Elasticsearch

    解壓安裝包:

    tar?-xzvf?elasticsearch-7.3.0-linux-x86_64.tar.gz

    啟動 Elasticsearch:

    cd?elasticsearch-7.3.0/ bin/elasticsearch

    在啟動 Elasticsearch 的過程中我遇到了兩個問題在這里列舉一下,方便大家排查。

    問題一 :內存過小,如果您的機器內存小于 Elasticsearch 設置的值,就會報下圖所示的錯誤。解決方案是,修改 elasticsearch-7.3.0/config/jvm.options 文件中的如下配置為適合自己機器的內存大小,若修改后還是報這個錯誤,可重新連接服務器再試一次。

    圖 4. 內存過小導致 Elasticsearch 啟動報錯

    圖片

    問題二 ,如果您是以 root 用戶啟動的話,就會報下圖所示的錯誤。解決方案自然就是添加一個新用戶啟動 Elasticsearch,至于添加新用戶的方法網上有很多,這里就不再贅述。

    圖 5. Root 用戶啟動 Elasticsearch 報錯

    圖片

    啟動成功后,另起一個會話窗口執行 curl http://localhost:9200 命令,如果出現如下結果,則代表 Elasticsearch 安裝成功。

    清單 2. 檢查 Elasticsearch 是否啟動成功

    elk@elk:~$?curl?http://localhost:9200 {"name"?:?"elk","cluster_name"?:?"elasticsearch","cluster_uuid"?:?"hqp4Aad0T2Gcd4QyiHASmA","version"?:?{"number"?:?"7.3.0","build_flavor"?:?"default","build_type"?:?"tar","build_hash"?:?"de777fa","build_date"?:?"2019-07-24T18:30:11.767338Z","build_snapshot"?:?false,"lucene_version"?:?"8.1.0","minimum_wire_compatibility_version"?:?"6.8.0","minimum_index_compatibility_version"?:?"6.0.0-beta1"},"tagline"?:?"You?Know,?for?Search" }

    安裝 Kibana

    解壓安裝包:

    tar?-xzvf?kibana-7.3.0-linux-x86_64.tar.gz

    修改配置文件 config/kibana.yml ,主要指定 Elasticsearch 的信息。

    清單 3. Kibana 配置信息#Elasticsearch主機地址

    elasticsearch.hosts:?"http://ip:9200" #?允許遠程訪問 server.host:?"0.0.0.0" #?Elasticsearch用戶名?這里其實就是我在服務器啟動Elasticsearch的用戶名 elasticsearch.username:?"es" #?Elasticsearch鑒權密碼?這里其實就是我在服務器啟動Elasticsearch的密碼 elasticsearch.password:?"es"

    啟動 Kibana:

    cd?kibana-7.3.0-linux-x86_64/bin ./kibana

    在瀏覽器中訪問 http://ip:5601 ,若出現以下界面,則表示 Kibana 安裝成功。

    圖 6. Kibana 啟動成功界面

    圖片

    ELK 日志平臺安裝完成后,下面我們就將通過具體的例子來看下如何使用 ELK,下文將分別介紹如何將 Spring Boot 日志和 Nginx 日志交由 ELK 分析。

    在 Spring Boot 中使用 ELK

    首先我們需要創建一個 Spring Boot 的項目,之前我寫過一篇文章介紹 如何使用 AOP 來統一處理 Spring Boot 的 Web 日志 ,本文的 Spring Boot 項目就建立在這篇文章的基礎之上。

    修改并部署 Spring Boot 項目

    在項目 resources 目錄下創建 spring-logback.xml 配置文件。

    清單 4. Spring Boot 項目 Logback 的配置

    <?xml?version="1.0"?encoding="UTF-8"?> <configuration?debug="false"><contextName>Logback?For?demo?Mobile</contextName><property?name="LOG_HOME"?value="/log"?/><springProperty?scope="context"?name="appName"?source="spring.application.name"defaultValue="localhost"?/>...<appender?name="ROLLING_FILE"?class="ch.qos.logback.core.rolling.RollingFileAppender">...<encoder?class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><pattern>%d{yyyy-MM-dd?HH:mm:ss.SSS}?[%thread]?%-5level?%logger{25}?${appName}?-%msg%n</pattern></encoder>...</appender>... </configuration>

    以上內容省略了很多內容,您可以在源碼中獲取。在上面的配置中我們定義了一個名為 ROLLING_FILE 的 Appender 往日志文件中輸出指定格式的日志。而上面的 pattern 標簽正是具體日志格式的配置,通過上面的配置,我們指定輸出了時間、線程、日志級別、logger(通常為日志打印所在類的全路徑)以及服務名稱等信息。

    將項目打包,并部署到一臺 Ubuntu 服務器上。

    清單 5. 打包并部署 Spring Boot 項目

    #?打包命令 mvn?package?-Dmaven.test.skip=true #?部署命令 java?-jar?sb-elk-start-0.0.1-SNAPSHOT.jar

    查看日志文件, logback 配置文件中我將日志存放在 /log/sb-log.log 文件中,執行 more /log/sb-log.log 命令,出現以下結果表示部署成功。

    圖 7. Spring Boot 日志文件

    圖片

    配置 Shipper 角色 Logstash

    Spring Boot 項目部署成功之后,我們還需要在當前部署的機器上安裝并配置 Shipper 角色的 Logstash。Logstash 的安裝過程在 ELK 平臺搭建小節中已有提到,這里不再贅述。安裝完成后,我們需要編寫 Logstash 的配置文件,以支持從日志文件中收集日志并輸出到 Redis 消息管道中,Shipper 的配置如下所示。

    清單 6. Shipper 角色的 Logstash 的配置

    input?{file?{path?=>?[#?這里填寫需要監控的文件"/log/sb-log.log"]} }output?{#?輸出到redisredis?{host?=>?"10.140.45.190"???#?redis主機地址port?=>?6379??????????????#?redis端口號db?=>?8???????????????????#?redis數據庫編號data_type?=>?"channel"????#?使用發布/訂閱模式key?=>?"logstash_list_0"??#?發布通道名稱} }

    其實 Logstash 的配置是與前面提到的 Logstash 管道中的三個部分(輸入、過濾器、輸出)一一對應的,只不過這里我們不需要過濾器所以就沒有寫出來。上面配置中 Input 使用的數據源是文件類型的,只需要配置上需要收集的本機日志文件路徑即可。Output 描述數據如何輸出,這里配置的是輸出到 Redis。

    Redis 的配置 data_type 可選值有 channel 和 list 兩個。channel 是 Redis 的發布/訂閱通信模式,而 list 是 Redis 的隊列數據結構,兩者都可以用來實現系統間有序的消息異步通信。channel 相比 list 的好處是,解除了發布者和訂閱者之間的耦合。舉個例子,一個 Indexer 在持續讀取 Redis 中的記錄,現在想加入第二個 Indexer,如果使用 list ,就會出現上一條記錄被第一個 Indexer 取走,而下一條記錄被第二個 Indexer 取走的情況,兩個 Indexer 之間產生了競爭,導致任何一方都沒有讀到完整的日志。channel 就可以避免這種情況。這里 Shipper 角色的配置文件和下面將要提到的 Indexer 角色的配置文件中都使用了 channel 。

    配置 Indexer 角色 Logstash

    配置好 Shipper 角色的 Logstash 后,我們還需要配置 Indexer 角色 Logstash 以支持從 Redis 接收日志數據,并通過過濾器解析后存儲到 Elasticsearch 中,其配置內容如下所示。

    清單 7. Indexer 角色的 Logstash 的配置

    input?{redis?{host??????=>?"192.168.142.131"????#?redis主機地址port??????=>?6379???????????????#?redis端口號db????????=>?8??????????????????#?redis數據庫編號data_type?=>?"channel"??????????#?使用發布/訂閱模式key???????=>?"sb-logback"??#?發布通道名稱} }filter?{#定義數據的格式grok?{match?=>?{?"message"?=>?"%{TIMESTAMP_ISO8601:time}?\[%{NOTSPACE:threadName}\]?%{LOGLEVEL:level}??%{DATA:logger}?%{NOTSPACE:applicationName}?-(?:.*=%{NUMBER:timetaken}ms|)"}} }output?{stdout?{}elasticsearch?{hosts?=>?"localhost:9200"index?=>?"logback"} }

    與 Shipper 不同的是,Indexer 的管道中我們定義了過濾器,也正是在這里將日志解析成結構化的數據。下面是我截取的一條 logback 的日志內容:

    清單 8. Spring Boot 項目輸出的一條日志

    2019-08-11?18:01:31.602?[http-nio-8080-exec-2]?INFO??c.i.s.aop.WebLogAspect?sb-elk?-接口日志 POST請求測試接口結束調用:耗時=11ms,result=BaseResponse{code=10000,?message='操作成功'}

    在 Filter 中我們使用 Grok 插件從上面這條日志中解析出了時間、線程名稱、Logger、服務名稱以及接口耗時幾個字段。Grok 又是如何工作的呢?

  • message 字段是 Logstash 存放收集到的數據的字段, match = {"message" => ...} 代表是對日志內容做處理。

  • Grok 實際上也是通過正則表達式來解析數據的,上面出現的 TIMESTAMP_ISO8601 、 NOTSPACE 等都是 Grok 內置的 patterns。

  • 我們編寫的解析字符串可以使用 Grok Debugger 來測試是否正確,這樣避免了重復在真實環境中校驗解析規則的正確性。

  • 查看效果

    經過上面的步驟,我們已經完成了整個 ELK 平臺的搭建以及 Spring Boot 項目的接入。下面我們按照以下步驟執行一些操作來看下效果。

    啟動 Elasticsearch,啟動命令在 ELK 平臺搭建 小節中有提到,這里不贅述(Kibana 啟動同)。啟動 Indexer 角色的 Logstash。

    #?進入到?Logstash?的解壓目錄,然后執行下面的命令 bin/logstash?-f?indexer-logstash.conf

    啟動 Kibana。

    啟動 Shipper 角色的 Logstash。

    #?進入到?Logstash?的解壓目錄,然后執行下面的命令 bin/logstash?-f?shipper-logstash.conf

    調用 Spring Boot 接口,此時應該已經有數據寫入到 ES 中了。

    在瀏覽器中訪問 http://ip:5601 ,打開 Kibana 的 Web 界面,并且如下圖所示添加 logback 索引。

    圖 8. 在 Kibana 中添加 Elasticsearch 索引

    圖片

    進入 Discover 界面,選擇 logback 索引,就可以看到日志數據了,如下圖所示。

    圖 9. ELK 日志查看

    圖片

    在 Nginx 中使用 ELK

    相信通過上面的步驟您已經成功的搭建起了自己的 ELK 實時日志平臺,并且接入了 Logback 類型的日志。但是實際場景下,幾乎不可能只有一種類型的日志,下面我們就再在上面步驟的基礎之上接入 Nginx 的日志。當然這一步的前提是我們需要在服務器上安裝 Nginx,具體的安裝過程網上有很多介紹,這里不再贅述。查看 Nginx 的日志如下(Nginx 的訪問日志默認在 /var/log/nginx/access.log 文件中)。

    清單 9. Nginx 的訪問日志

    192.168.142.1?-?-?[17/Aug/2019:21:31:43?+0800]?"GET?/weblog/get-test?name=elk?HTTP/1.1" 200?3?"http://192.168.142.131/swagger-ui.html"?"Mozilla/5.0?(Windows?NT?10.0;?Win64;?x64) AppleWebKit/537.36?(KHTML,?like?Gecko)?Chrome/76.0.3809.100?Safari/537.36"

    同樣,我們需要為此日志編寫一個 Grok 解析規則,如下所示:

    清單 10. 針對 Nginx 訪問日志的 Grok 解析規則

    %{IPV4:ip}?\-?\-?\[%{HTTPDATE:time}\]?"%{NOTSPACE:method}?%{DATA:requestUrl} HTTP/%{NUMBER:httpVersion}"?%{NUMBER:httpStatus}?%{NUMBER:bytes} "%{DATA:referer}"?"%{DATA:agent}"

    完成上面這些之后的關鍵點是 Indexer 類型的 Logstash 需要支持兩種類型的輸入、過濾器以及輸出,如何支持呢?首先需要給輸入指定類型,然后再根據不同的輸入類型走不同的過濾器和輸出,如下所示(篇幅原因,配置文件在此沒有全部展示,可以 點擊此處獲取 )。

    清單 11. 支持兩種日志輸入的 Indexer 角色的 Logstash 配置

    input?{redis?{type??????=>?"logback"...}redis?{type???????=>?"nginx"...} }filter?{if?[type]?==?"logback"?{...}if?[type]?==?"nginx"?{...} }output?{if?[type]?==?"logback"?{...}if?[type]?==?"nginx"?{...} }

    我的 Nginx 與 Spring Boot 項目部署在同一臺機器上,所以還需修改 Shipper 類型的 Logstash 的配置以支持兩種類型的日志輸入和輸出,其配置文件的內容可 點擊這里獲取 。以上配置完成后,我們按照 查看效果 章節中的步驟,啟動 ELK 平臺、Shipper 角色的 Logstash、Nginx 以及 Spring Boot 項目,然后在 Kibana 上添加 Nignx 索引后就可同時查看 Spring Boot 和 Nginx 的日志了,如下圖所示。

    圖 10. ELK 查看 Nginx 日志

    圖片

    ELK 啟動

    在上面的步驟中,ELK 的啟動過程是我們一個一個的去執行三大組件的啟動命令的。而且還是在前臺啟動的,意味著如果我們關閉會話窗口,該組件就會停止導致整個 ELK 平臺無法使用,這在實際工作過程中是不現實的,我們剩下的問題就在于如何使 ELK 在后臺運行。根據 《Logstash 最佳實踐》 一書的推薦,我們將使用 Supervisor 來管理 ELK 的啟停。首先我們需要安裝 Supervisor,在 Ubuntu 上執行 apt-get install supervisor 即可。安裝成功后,我們還需要在 Supervisor 的配置文件中配置 ELK 三大組件(其配置文件默認為 /etc/supervisor/supervisord.conf 文件)。

    清單 12. ELK 后臺啟動

    [program:elasticsearch] environment=JAVA_HOME="/usr/java/jdk1.8.0_221/" directory=/home/elk/elk/elasticsearch user=elk command=/home/elk/elk/elasticsearch/bin/elasticsearch[program:logstash] environment=JAVA_HOME="/usr/java/jdk1.8.0_221/" directory=/home/elk/elk/logstash user=elk command=/home/elk/elk/logstash/bin/logstash?-f?/home/elk/elk/logstash/indexer-logstash.conf[program:kibana] environment=LS_HEAP_SIZE=5000m directory=/home/elk/elk/kibana user=elk command=/home/elk/elk/kibana/bin/kibana

    [按照以上內容配置完成后,執行 sudo supervisorctl reload 即可完成整個 ELK 的啟動,而且其默認是開機自啟。當然,我們也可以使用 sudo supervisorctl start/stop program_name] 來管理單獨的應用。

    結束語

    在本教程中,我們主要了解了什么是 ELK,然后通過實際操作和大家一起搭建了一個 ELK 日志分析平臺,并且接入了 Logback 和 Nginx 兩種日志。

    往期推薦

    MySQL中使用“utf8”的坑有多少人遇到過,下次注意記得用“utf8mb4”

    為啥微信有掃一掃登錄,而我們沒有?從0到1搞定掃碼登錄(附源碼)

    面試官:請你說說k8s 和 Docker的區別?

    架構師:關系型數據庫設計技巧?

    面試官:給我講講你的項目是怎么性能優化的?

    怎么樣通過Nginx實現限流?

    非常nice的分布式事務方案總結

    精髓!深入淺出剖析12個Zookeeper知識點

    12306 支撐百萬 QPS 的核心秘訣!

    總結

    以上是生活随笔為你收集整理的Elasticsearch方案管理 Spring Boot 和 Nginx 日志的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。