ELK 日志系统
?
Elastic 官方文檔:https://www.elastic.co/guide/index.html
elasticsearch github:https://github.com/elastic/elasticsearch
logstash github:https://github.com/elastic/logstash
kibana github:https://github.com/elastic/kibana
從 ELK 到 EFK:https://www.sohu.com/a/198596248_748431
Elasticsearch: 權威指南:https://www.elastic.co/guide/cn/elasticsearch/guide/current/index.html
ELK 快速指南:https://blog.csdn.net/bluetjs/article/details/78770447
ELK實時日志分析平臺環境部署--完整記錄:http://www.cnblogs.com/kevingrace/p/5919021.html
集中式日志分析平臺 - ELK Stack - 部署篇:https://www.jianshu.com/p/934c457a333c
集中式日志系統 ELK 協議棧詳解:https://www.ibm.com/developerworks/cn/opensource/os-cn-elk/
ELK+Filebeat 集中式日志解決方案詳解:https://www.ibm.com/developerworks/cn/opensource/os-cn-elk-filebeat/index.html
ELK部署詳解:https://segmentfault.com/a/1190000007728789
Centos7 之安裝Logstash ELK stack 日志管理系統:https://www.cnblogs.com/hanyifeng/p/5509985.html
中小型研發團隊架構實踐七:集中式日志ELK:https://www.cnblogs.com/supersnowyao/p/8375926.html
ELK實時日志分析平臺環境部署--完整記錄:https://www.cnblogs.com/kevingrace/p/5919021.html
ELK 之Filebeat 結合Logstash 過濾出來你想要的日志:http://blog.51cto.com/seekerwolf/2110174
我的ELK搭建筆記(阿里云上部署):https://www.jianshu.com/p/797073c1913f
ELK 搭建篇:https://www.cnblogs.com/yuhuLin/p/7018858.html
通過ELK快速搭建一個你可能需要的集中化日志平臺:https://www.cnblogs.com/huangxincheng/p/7918722.html
Logstat 輸入插件配置:https://www.elastic.co/guide/en/logstash/current/input-plugins.html
使用logstash的logstash-input-kafka插件讀取kafka中的數據:https://blog.csdn.net/lvyuan1234/article/details/78653324
ELK Stack (系列文章):http://www.linuxe.cn/sort/elk
項目實戰14—ELK 企業內部日志分析系統:https://www.cnblogs.com/along21/p/8509123.html
最新Centos7.6 部署ELK日志分析系統:https://segmentfault.com/a/1190000019799137
ELK日志系統淺析與部署:https://blog.csdn.net/qq_22211217/article/details/80764568
隨筆分類 - ELK:https://www.cnblogs.com/workdsz/category/1257841.html
ELK 筆記:https://blog.csdn.net/ahri_j/category_7519196.html
ES基本概念與 API 操作:https://blog.csdn.net/Ahri_J/article/details/79720824
es 基本API操作使用:https://blog.csdn.net/zhangcongyi420/article/details/94362108
ELK、FILEBEAT日志分析平臺搭建:https://shuwoom.com/?p=2300
?
ElasticSearch總結:https://www.cnblogs.com/aiqiqi/p/11451411.html
?
ELK 是 Elasticsearch、Logstash、Kibana的簡稱,這三者是核心套件,但并非全部。
- Elasticsearch 是實時全文搜索和分析引擎,提供搜集、分析、存儲數據三大功能;是一套開放 REST 和 JAVA API 等結構提供高效搜索功能,可擴展的分布式系統。它構建于 Apache Lucene 搜索引擎庫之上。
- Logstash 是一個用來搜集、分析、過濾日志的工具。它支持幾乎任何類型的日志,包括系統日志、錯誤日志和自定義應用程序日志。它可以從許多來源接收日志,這些來源包括 syslog、消息傳遞(例如 RabbitMQ)和 JMX,它能夠以多種方式輸出數據,包括電子郵件、websockets 和 Elasticsearch。
- Kibana 是一個基于 Web 的圖形界面,用于搜索、分析和可視化存儲在 Elasticsearch 指標中的日志數據。它利用 Elasticsearch 的 REST 接口來檢索數據,不僅允許用戶創建他們自己的數據的定制儀表板視圖,還允許他們以特殊的方式查詢和過濾數據
?
項目由來
(1)開發人員不能登錄線上服務器查看詳細日志,經過運維周轉費時費力
(2)日志數據分散在多個系統,難以查找與整合
(3)日志數據量巨大,查詢速度太慢,無法滿足需求
(4)無法全局掌控項目運行狀況
(5)日志數據查詢不夠實時
(6)數據分析人員不會寫代碼,無法分析統計數據
(7).........
?
框架里包含的組件
ELK 是 elastic 公司旗下三款產品?ElasticSearch?、Logstash?、Kibana?的首字母組合。
Logstash + Elasticsearch + Kibana(ELK)
Logstash:? ? ? ? ?監控,過濾,收集日志。即傳輸和處理你的日志、事務或其他數據。
Elasticsearch:? 存儲日志,提供搜索功能。ElasticSearch 是一個基于?Lucene?構建的開源,分布式,RESTful 搜索引擎。
kibana:? ? ? ? ? ? ?提供web界面,支持查詢,統計,和圖表展現。即 將 Elasticsearch 的數據分析并渲染為可視化的報表。
filebeat:? ? ? ? ? ? 輕量級的日志收集工具。
很多公司都采用該架構構建分布式日志系統,包括 新浪微博,freewheel,暢捷通等
注意:在應用端收集日志時,建議用 filebeat 。
通過 ELK 這套解決方案,可以同時實現日志收集、日志搜索和日志分析的功能。
?
架構設計
如果日志量很大,Logstash 會遇到資源占用高的問題,為解決這個問題,引入了 Filebeat。Filebeat 是基于 logstash-forwarder 的源碼改造而成,用 Golang 編寫,無需依賴 Java 環境,效率高,占用內存和 CPU 比較少,非常適合作為 Agent 跑在服務器上。Filebeat 可以看做是新一代的 logstash-forward,但是性能超 logstash,部署簡單,占用資源少,可以很方便的和logstash和ES對接,作為日志文件采集組件。Filebeat 是 Beats 家族的一員,后續可以使用 Packetbeat 進行網絡數據采集、Winlogbeat 進行 Windosw事件采集、Heartbeat 進行心跳采集、Metricbeat 進行系統指標采集。這種架構解決了 Logstash 在各服務器節點上占用系統資源高的問題。相比 Logstash,Beats 所占系統的 CPU 和內存幾乎可以忽略不計。另外,Beats 和 Logstash 之間支持 SSL/TLS 加密傳輸,客戶端和服務器雙向認證,保證了通信安全。
LogStash 可以用來對日志進行收集并進行過濾整理后輸出到 ES 中,FileBeats 是一個更加輕量級的日志收集工具。現在最常用的方式是通過 FileBeats 收集目標日志,然后統一輸出到 LogStash 做進一步的過濾,在由 LogStash 輸出到 ES 中進行存儲。
(1)使用filebeat
架構設計1:filebeat --> logstash(parse) --> es集群(Elasticsearch 集群)?--> kibana--ngix
?缺點:如果 logstash 出問題會導致 filebeat 收集的數據丟失
架構設計2:filebeat --> logstash(parse)[loadbalance] --> es集群 --> kibana--ngix
filebeat 和 logstash 耦合性太高
架構設計3:filebeat(3臺)--> redis --> logstash(parse) --> es集群 --> kibana -- ngix(可選)?
里面 redis 是一個單線程的實例,redis 單線程每秒處理能力一般是 10W 次左右。
架構設計4:filebeat --> redis/kafka --> logstash(parse) --> es --> kibana--ngix
filebeat1.3 版本不支持輸出到 kafka,5.x 版本中支持輸出到 kafka
(2)不使用 filebeat
logstash --> kafka --> logstash(parse) --> es --> kibana--ngix
里面 kafka 支持水平擴展,可以使用多分區,支持多線程并行執行。
在應用端收集日志的話,logstash 比較重量級,性能消耗比 filebeat 大
(3)Filebeat 用于日志收集和傳輸,相比 Logstash 更加輕量級和易部署,對系統資源開銷更小。
?
?
為什么做日志系統 ?
?
首先,什么是日志??日志就是程序產生的,遵循一定格式(通常包含時間戳)的文本數據
通常日志由服務器生成,輸出到不同的文件中,一般會有系統日志、 應用日志、安全日志。這些日志分散地存儲在不同的機器上。
通常當系統發生故障時,工程師需要登錄到各個服務器上,使用 grep、sed、awk 等 Linux 腳本工具去日志里查找故障原因。在沒有日志系統的情況下,首先需要定位處理請求的服務器,如果這臺服務器部署了多個實例,則需要去每個應用實例的日志目錄下去找日志文件。每個應用實例還會設置日志滾動策略(如:每天生成一個文件),還有日志壓縮歸檔策略等。
這樣一系列流程下來,對于我們排查故障以及及時找到故障原因,造成了比較大的麻煩。因此,如果我們能把這些日志集中管理,并提供集中檢索功能,不僅可以提高診斷的效率,同時對系統情況有個全面的理解,避免事后救火的被動。
日志數據在以下幾方面具有非常重要的作用:
-
數據查找:通過檢索日志信息,定位相應的 bug ,找出解決方案
-
服務診斷:通過對日志信息進行統計、分析,了解服務器的負荷和服務運行狀態
-
數據分析:可以做進一步的數據分析,比如根據請求中的課程 id ,找出 TOP10 用戶感興趣課程。
針對這些問題,為了提供分布式的實時日志搜集和分析的監控系統,我們采用了業界通用的日志數據管理解決方案 - 它主要包括 Elasticsearch 、 Logstash 和 Kibana 三個系統。通常,業界把這套方案簡稱為 ELK,取三個系統的首字母,但是我們實踐之后將其進一步優化為 EFK,F代表Filebeat,用以解決 Logstash 導致的問題。
?
?
Elasticsearch、Logstash、Kibana、Filebeat、Kafka
?
Elasticsearch 和 MySQL 對比:
終于有人把Elasticsearch原理講透了:https://developer.51cto.com/art/201904/594615.htm
官網地址:https://www.elastic.co
這一套軟件可以當作一個 MVC 模型:logstash 是 controller 層,Elasticsearch 是一個 model 層,kibana 是 view 層。首先將數據傳給 logstash,它將數據進行過濾和格式化(轉成 JSON 格式),然后傳給 Elasticsearch 進行存儲、建搜索的索引,kibana提供前端的頁面再進行搜索和圖表可視化,它是調用 Elasticsearch 的接口返回的數據進行可視化。logstash 和 Elasticsearch 是用 Java 寫的,kibana 使用node.js 框架。
這套軟件官網有很詳細的使用說明,https://www.elastic.co/,除了docs之外,還有視頻教程。
友情提示:安裝 ELK 時,三個應用請選擇統一的版本,避免出現一些莫名其妙的問題。例如:由于版本不統一,導致三個應用間的通訊異常。
?
?
ELK 架構
?
ELK 技術棧 的一個架構圖:
?
?
說明:以上是 ELK 技術棧的一個架構圖。從圖中可以清楚的看到數據流向。
- Beats?(https://www.elastic.co/products/beats) 是單一用途的數據傳輸平臺,它可以將多臺機器的數據發送到 Logstash 或 ElasticSearch。但 Beats 并不是不可或缺的一環,所以本文中暫不介紹。
- Logstash:數據收集處理引擎。支持動態的從各種數據源搜集數據,并對數據進行過濾、分析、豐富、統一格式等操作,然后存儲以供后續使用。logstash 其實就是一個數據分析軟件,主要目的是分析 log 日志。Logstash?是一個動態數據收集管道。支持以 TCP/UDP/HTTP 多種方式收集數據(也可以接受 Beats 傳輸來的數據),并對數據做進一步豐富或提取字段處理。
logstash 日志分析的配置和使用:https://www.cnblogs.com/yincheng/p/logstash.html
ELK 之 Logstash 安裝與配置及使用:?https://blog.csdn.net/CleverCode/article/details/78632887 - Kibana:可視化化平臺。它能夠搜索、展示存儲在 Elasticsearch 中索引數據。使用它可以很方便的用圖表、表格、地圖展示和分析數據。Kibana?是一個基于瀏覽器頁面的 Elasticsearch 前端展示工具,是 ELK 的用戶界面,也是一個開源和免費的工具。它將收集的數據進行可視化展示(各種報表、圖形化數據),并提供配置、管理 ELK 的界面。Kibana可以為 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以幫助您匯總、分析和搜索重要數據日志。
- Elasticsearch:分布式搜索引擎。具有高可伸縮、高可靠、易管理等特點。可以用于全文檢索、結構化檢索和分析。Elasticsearch、Logstash 和?Kibana 這三個可以結合起來。Elasticsearch 基于 Lucene 開發,現在是使用最廣的開源搜索引擎之一,Wikipedia 、StackOverflow、Github 等都基于它來構建自己的搜索引擎。ElasticSearch?是一個基于 JSON 的分布式的搜索和分析引擎。作為 ELK 的核心,它集中存儲數據。
- Filebeat:輕量級數據收集引擎。基于原先 Logstash-fowarder 的源碼改造出來。換句話說:Filebeat就是新版的 Logstash-fowarder,也會是 ELK Stack 在 shipper 端的第一選擇。
?
ELK 工作原理展示圖:
如上圖:Logstash 收集 AppServer 產生的 Log,并存放到 ElasticSearch 集群中,而 Kibana 則從 ES 集群中查詢數據生成圖表,再返回給 Browser。
?
Logstash 工作原理:
Logstash事件處理有三個階段:inputs → filters → outputs。是一個接收,處理,轉發日志的工具。支持系統日志,webserver日志,錯誤日志,應用日志,總之包括所有可以拋出來的日志類型。
?
Input:輸入數據到logstash。
Logstash Reference:https://www.elastic.co/guide/en/logstash/current/index.html
?
一些常用的輸入為:
Logstat 輸入插件配置:https://www.elastic.co/guide/en/logstash/current/input-plugins.html
file:從文件系統的文件中讀取,類似于tial -f命令
syslog:在514端口上監聽系統日志消息,并根據RFC3164標準進行解析
redis:從redis service中讀取
beats:從filebeat中讀取
Filters:數據中間處理,對數據進行操作。
?
一些常用的過濾器為:
Logstat 過濾插件:https://www.elastic.co/guide/en/logstash/current/filter-plugins.html
grok:解析任意文本數據,Grok 是 Logstash 最重要的插件。它的主要作用就是將文本格式的字符串,轉換成為具體的結構化的數據,配合正則表達式使用。內置120多個解析語法。
mutate:對字段進行轉換。例如對字段進行刪除、替換、修改、重命名等。
drop:丟棄一部分events不進行處理。
clone:拷貝 event,這個過程中也可以添加或移除字段。
geoip:添加地理信息(為前臺kibana圖形化展示使用)
Outputs:outputs是logstash處理管道的最末端組件。一個event可以在處理過程中經過多重輸出,但是一旦所有的outputs都執行結束,這個event也就完成生命周期。
?
一些常見的outputs為:
Logstat 輸出插件:https://www.elastic.co/guide/en/logstash/current/output-plugins.html
elasticsearch:可以高效的保存數據,并且能夠方便和簡單的進行查詢。
file:將event數據保存到文件中。
graphite:將event數據發送到圖形化組件中,一個很流行的開源存儲圖形化展示的組件。
Codecs:codecs 是基于數據流的過濾器,它可以作為input,output的一部分配置。Codecs可以幫助你輕松的分割發送過來已經被序列化的數據。
?
一些常見的codecs:
Logstat codes :https://www.elastic.co/guide/en/logstash/current/codec-plugins.html
json:使用json格式對數據進行編碼/解碼。
multiline:將匯多個事件中數據匯總為一個單一的行。比如:java異常信息和堆棧信息。
?
?
簡單版架構
圖 1
圖 2
這種架構下把 Logstash 實例與 Elasticsearch 實例直接相連。Logstash 實例直接通過 Input 插件讀取數據源數據(比如 Java 日志, Nginx 日志等),經過 Filter 插件進行過濾日志,最后通過 Output 插件將數據寫入到 ElasticSearch 實例中(Logstash部署在各個節點上搜集相關日志、數據,并經過分析、過濾后發送給遠端服務器上的Elasticsearch進行存儲)。Elasticsearch 再將數據以分片的形式壓縮存儲,并提供多種API供用戶查詢、操作。用戶可以通過Kibana Web直觀的對日志進行查詢,并根據需求生成數據報表。
這個階段,日志的收集、過濾、輸出等功能,主要由這三個核心組件組成 Input 、Filter、Output
- Input:輸入,輸入數據可以是 File 、 Stdin(直接從控制臺輸入) 、TCP、Syslog 、Redis 、Collectd 等
- Filter:過濾,將日志輸出成我們想要的格式。Logstash 存在豐富的過濾插件:Grok 正則捕獲、時間處理、JSON 編解碼、數據修改 Mutate 。Grok 是 Logstash 中最重要的插件,強烈建議每個人都要使用 Grok Debugger 來調試自己的 Grok 表達式:grok { match => ["message", "(?m)[%{LOGLEVEL:level}] [%{TIMESTAMP_ISO8601:timestamp}] [%{DATA:logger}] [%{DATA:threadId}] [%{DATA:requestId}] %{GREEDYDATA:msgRawData}"] }
- Output:輸出,輸出目標可以是 Stdout (直接從控制臺輸出)、Elasticsearch 、Redis 、TCP 、File 等
這是最簡單的一種ELK架構方式,Logstash 實例直接與 Elasticsearch 實例連接。優點是搭建簡單,易于上手。建議供初學者學習與參考,不能用于線上的環境。
?
?
集群版架構
?
圖 1
此架構適合大型集群、海量數據的業務場景,它通過將前端Logstash Agent替換成filebeat,有效降低了收集日志對業務系統資源的消耗。同時,消息隊列使用kafka集群架構,有效保障了收集數據的安全性和穩定性,而后端Logstash和Elasticsearch均采用集群模式搭建,從整體上提高了ELK系統的高效性、擴展性和吞吐量。
圖 2
這種架構下我們采用多個 Elasticsearch 節點組成 Elasticsearch 集群,由于 Logstash 與 Elasticsearch 采用集群模式運行,集群模式可以避免單實例壓力過重的問題,同時在線上各個服務器上部署 Logstash Agent,來滿足數據量不大且可靠性不強的場景。
數據收集端:每臺服務器上面部署 Logstash Shipper Agent 來收集當前服務器上日志,日志經過 Logstash Shipper 中 Input插件、Filter插件、Output 插件傳輸到 Elasticsearch 集群
數據存儲與搜索:Elasticsearch 配置默認即可滿足,同時我們看數據重要性來決定是否添加副本,如果需要的話,最多一個副本即可
數據展示:Kibana 可以根據 Elasticsearch 的數據來做各種各樣的圖表來直觀的展示業務實時狀況
這種架構使用場景非常有限,主要存在以下兩個問題
-
消耗服務器資源:Logstash 的收集、過濾都在服務器上完成,這就造成服務器上占用系統資源較高、性能方面不是很好,調試、跟蹤困難,異常處理困難
-
數據丟失:大并發情況下,由于日志傳輸峰值比較大,沒有消息隊列來做緩沖,就會導致 Elasticsearch 集群丟失數據
這個架構相對上個版本略微復雜,不過維護起來同樣比較方便,同時可以滿足數據量不大且可靠性不強的業務使用。
?
?
引入消息隊列
?
圖 1
此架構主要特點是引入了消息隊列機制,位于各個節點上的Logstash Agent(一級Logstash,主要用來傳輸數據)先將數據傳遞給消息隊列(常見的有Kafka、Redis等),接著,Logstash server(二級Logstash,主要用來拉取消息隊列數據,過濾并分析數據)將格式化的數據傳遞給Elasticsearch進行存儲。最后,由Kibana將日志和數據呈現給用戶。由于引入了Kafka(或者Redis)緩存機制,即使遠端Logstash server因故障停止運行,數據也不會丟失,因為數據已經被存儲下來了。
這種架構適合于較大集群、數據量一般的應用環境,但由于二級Logstash要分析處理大量數據,同時Elasticsearch也要存儲和索引大量數據,因此它們的負荷會比較重,解決的方法是將它們配置為集群模式,以分擔負載。
此架構的優點在于引入了消息隊列機制,均衡了網絡傳輸,從而降低了網絡閉塞尤其是丟失數據的可能性,但依然存在Logstash占用系統資源過多的問題,在海量數據應用場景下,可能會出現性能瓶頸。
圖 2
該場景下面,多個數據首先通過 Logstash Shipper Agent 來收集數據,然后經過 Output 插件將數據投遞到 Kafka 集群中,這樣當遇到 Logstash 接收數據的能力超過 Elasticsearch 集群處理能力的時候,就可以通過隊列就能起到削峰填谷的作用, Elasticsearch 集群就不存在丟失數據的問題。
目前業界在日志服務場景中,使用比較多的兩種消息隊列為 :Kafka 和?Redis。盡管 ELK Stack 官網建議使用 Redis 來做消息隊列,但是我們建議采用 Kafka 。主要從下面兩個方面考慮:
-
數據丟失:Redis 隊列多用于實時性較高的消息推送,并不保證可靠。Kafka保證可靠但有點延時。
-
數據堆積:Redis 隊列容量取決于機器內存大小,如果超過設置的Max memory,數據就會拋棄。Kafka 的堆積能力取決于機器硬盤大小。
?
綜合上述的理由,我們決定采用 Kafka 來緩沖隊列。不過在這種架構下仍然存在一系列問題
-
Logstash shipper 收集數據同樣會消耗 CPU 和內存資源
-
不支持多機房部署
這種架構適合較大集群的應用部署,通過消息隊列解決了消息丟失、網絡堵塞的問題。
?
?
多機房部署
?
隨著業務的飛速增長,單機房的架構已經不能滿足需求,不可避免的需要將業務分布到不同機房中,對于日志服務來說也是不小的挑戰。當然業界也有不少成熟的方法,比如阿里的單元化、騰訊的 SET 方案等等。單元化在這邊不詳細展開,大家可以參考微博的【單元化架構】。
最終我們決定采用單元化部署的方式來解決 ELK 多機房中遇到的問題(延時、專線流量過大等),從日志的產生、收集、傳輸、存儲、展示都是在同機房里面閉環消化,不存在跨機房傳輸與調用的問題。因為交互緊密的應用盡量部署在同機房,所以這種方案并不會給業務查詢造成困擾。
Logstash、Elasticsearch、Kafka、Kibana 四個集群都部署到同一機房中,每個機房都要每個機房自己的日志服務集群,比如A機房業務的日志只能傳輸給本機房 Kafka ,而A機房 Indexer 集群消費并寫入到A機房 Elasticsearch 集群中,并由A機房 Kibana 集群展示,中間任何一個步驟不依賴B機房任何服務。
?
?
引入 Filebeat
?
如果日志量很大,Logstash 會遇到資源占用高的問題,為解決這個問題,引入了 Filebeat。Filebeat 是基于 logstash-forwarder 的源碼改造而成,用 Golang 編寫,無需依賴 Java 環境,效率高,占用內存 和 CPU 比較少,非常適合作為 Agent 跑在服務器上。
下面看看 Filebeat 的基本用法。編寫配置文件,從 Nginx access.log 中解析日志數據:
# filebeat.ymlfilebeat.prospectors:- input_type: log paths: /var/log/nginx/access.log json.message_key:output.elasticsearch: hosts: ["localhost"] index: "filebeat-nginx-%{+yyyy.MM.dd}"
我們來看看壓測數據:
壓測環境
-
虛擬機 8 cores 64G內存 540G SATA盤
-
Logstash 版本 2.3.1
-
Filebeat 版本 5.5.0
壓測方案
Logstash / Filebeat 讀取 350W 條日志 到 console,單行數據 580B,8個進程寫入采集文件
壓測結果
| Logstash | 8 | 53.7% | 210s | 1.6w line/s |
| Filebeat | 8 | 38.0% | 30s | 11w line/s |
Filebeat 所消耗的CPU只有 Logstash 的70%,但收集速度為 Logstash 的7倍。從我們的應用實踐來看,Filebeat 確實用較低的成本和穩定的服務質量,解決了 Logstash 的資源消耗問題。
?
最后,分享給大家一些血淚教訓,希望大家以我為鑒。
1. Indexer 運行一段時間后自動掛掉
突然有一天監控發現日志不消費了,排查下來發現消費 Kafka 數據的 indexer 掛掉了。所以,Indexer 進程也是需要用 supervisor 來監控的,保證它時刻都在運行。
2. Java異常日志輸出
開始我們在通過 grok 切割日志的時候,發現 Java 的 Exception 日志輸出之后,會出現換行的問題。后來使用 Logstash?codec/multiline插件來解決。
input { stdin { codec => multiline { pattern => "^[" negate => true what => "previous" } }} 3. 由于時區導致日志8小時時差
Logstash 2.3版本 date插件配置如下,查看解析結果發現@timestamp比中國時間早了8小時。
解決方案 Kibana 讀取瀏覽器的當前時區,然后在頁面上轉換時間內容的顯示。
date { match => [ "log_timestamp", "YYYY-MM-dd HH:mm:ss.SSS" ] target => "@timestamp" } 4.Grok parse failure
我們遇到線上 node 日志突然有幾天日志查看不出來。后來拉出原始日志對比才發現生成出來的日志格式不正確,同時包含 JSON 格式和非 JSON 格式的日志。但是我們用grok解析的時候采用是 json 格式。建議大家輸出日志保證格式一致同時不要出現空格等異常字符,可以使用在線 grok debug (http://grokdebug.herokuapp.com/) 來調試正則。
?
總結
基于 ELK stack 的日志解決方案的優勢主要體現于:
-
可擴展性:采用高可擴展性的分布式系統架構設計,可以支持每日 TB 級別的新增數據。
-
使用簡單:通過用戶圖形界面實現各種統計分析功能,簡單易用,上手快
-
快速響應:從日志產生到查詢可見,能達到秒級完成數據的采集、處理和搜索統計。
-
界面炫麗:Kibana 界面上,只需要點擊鼠標,就可以完成搜索、聚合功能,生成炫麗的儀表板。
參考資料
-
https://www.elastic.co/guide/en/beats/filebeat/1.3/filebeat-overview.html
-
https://zhuanlan.zhihu.com/p/26399963
?
?
安裝
?
ELK 要求本地環境中安裝了 JDK 。如果不確定是否已安裝,可使用下面的命令檢查:java -version
友情提示:安裝 ELK 時,三個應用請選擇統一的版本,避免出現一些莫名其妙的問題。
? ? ? ? ? ? ? ? ? 例如:由于版本不統一,導致三個應用間的通訊異常。
?
安裝 FAQ
?
elasticsearch 不允許以 root 權限來運行。
問題:在 Linux 環境中,elasticsearch 不允許以 root 權限來運行。如果以 root 身份運行 elasticsearch,會提示這樣的錯誤:can not run elasticsearch as root
解決方法:使用非 root 權限賬號運行 elasticsearch
# 創建用戶組 groupadd elk # 創建新用戶,-g elk 設置其用戶組為 elk,-p elk 設置其密碼為 elk useradd elk -g elk -p elk # 更改 /opt 文件夾及內部文件的所屬用戶及組為 elk:elk chown -R elk:elk /opt # 假設你的 elasticsearch 安裝在 opt 目錄下 # 切換賬號 su elk?
vm.max_map_count 不低于 262144
問題:vm.max_map_count 表示虛擬內存大小,它是一個內核參數。elasticsearch 默認要求 vm.max_map_count 不低于 262144。
max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
解決方法:你可以執行以下命令,設置 vm.max_map_count ,但是重啟后又會恢復為原值。
sysctl -w vm.max_map_count=262144持久性的做法是在 /etc/sysctl.conf 文件中修改 vm.max_map_count 參數:
echo "vm.max_map_count=262144" > /etc/sysctl.conf sysctl -p注意:如果運行環境為 docker 容器,可能會限制執行 sysctl 來修改內核參數。這種情況下,你只能選擇直接修改宿主機上的參數了。
?
nofile 不低于 65536
問題: nofile 表示進程允許打開的最大文件數。elasticsearch 進程要求可以打開的最大文件數不低于 65536。
max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]
解決方法:在 /etc/security/limits.conf 文件中修改 nofile 參數
echo "* soft nofile 65536" > /etc/security/limits.conf echo "* hard nofile 131072" > /etc/security/limits.conf?
nproc 不低于 2048
問題: nproc 表示最大線程數。elasticsearch 要求最大線程數不低于 2048。
max number of threads [1024] for user [user] is too low, increase to at least [2048]
解決方法:在 /etc/security/limits.conf 文件中修改 nproc 參數
echo "* soft nproc 2048" > /etc/security/limits.conf echo "* hard nproc 4096" > /etc/security/limits.conf?
Kibana No Default Index Pattern Warning
問題:安裝 ELK 后,訪問 kibana 頁面時,提示以下錯誤信息:
Warning No default index pattern. You must select or create one to continue.
...
Unable to fetch mapping. Do you have indices matching the pattern?
這就說明 logstash 沒有把日志寫入到 elasticsearch。
解決方法:檢查 logstash 與 elasticsearch 之間的通訊是否有問題,一般問題就出在這。
?
Elasticsearch
安裝步驟:
確定機器已經安裝了 Java 環境后,就可以安裝 ES 了。官網提供了壓縮包可以直接下載,
1.?elasticsearch 官方下載地址下載所需版本包并解壓到本地。本次安裝以Ubuntu為例。
右鍵選擇?復制鏈接地址 ,使用?wget?下載?Filebeat.tar.gz?壓縮包。然后使用?tar -zxvf?命令解壓。
# 下載壓縮包 wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.2.2.tar.gz # 解壓 tar -xzf elasticsearch-6.2.2.tar.gz # 進入文件 cd elasticsearch-6.2.2/Windows、MAC、Linux 下載安裝:
Linux 上可以執行下面的命令來下載壓縮包: curl -L -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.0.0.tar.gzMac 上可以執行以下命令來進行安裝: brew install elasticsearchWindows 上可以選擇 MSI 可執行安裝程序,將應用安裝到本地2.?解壓完成后進入目錄,啟動命令在 bin 目錄下,直接運行命令就可以啟動了。
? ? ? ? Linux 下運行?bin/elasticsearch?( Windows 上運行?bin\elasticsearch.bat)
? ? ? ? 注意:在 Linux 環境中,elasticsearch 不允許以 root 權限來運行。使用非 root 權限賬號運行 elasticsearch
# 創建用戶組 groupadd elk # 創建新用戶,-g elk 設置其用戶組為 elk,-p elk 設置其密碼為 elk useradd elk -g elk -p elk # 更改 /opt 文件夾及內部文件的所屬用戶及組為 elk:elk chown -R elk:elk /opt # 假設你的 elasticsearch 安裝在 opt 目錄下 # 切換賬號 su elk?
?
3.?驗證運行成功:linux 上可以執行?curl http://localhost:9200/?;windows 上可以用訪問 REST 接口的方式來訪問?http://localhost:9200/
上圖表示Elasticsearch正常啟動。
ElasticSearch 的默認啟動端口是 9200。手動訪問出現如下信息說明啟動成功。
?
Logstash
安裝步驟:
1. 在?logstash 官方下載地址下載所需版本包并解壓到本地。
右鍵 選擇?復制鏈接地址,使用?wget?下載?tar.gz?壓縮包。然后使用 tar 解壓
tar -zxvf logstash-6.2.2.tar.gz # 進入目錄 cd logstash-6.2.22.配置?logstash。需要創建一個配置文件,并指定要使用的插件和每個插件的設置。我們創建名為?logstash-simple.conf?的文件并將其保存在與Logstash相同的目錄中。LogStash 的運行需要指定一個配置文件,來指定數據的流向。
創建配置文件
cd logstash-6.4.0/ vi logstash-simple.conf在?logstash-simple.conf?中輸入以下內容
input { stdin { } } output { elasticsearch { hosts => ["localhost:9200"] } stdout { codec => rubydebug } }或者:
# 配置輸入為 beats input {beats {port => "5044"} }# 數據過濾 filter {grok {match => { "message" => "%{COMBINEDAPACHELOG}" }}geoip {source => "clientip"} }# 輸出到本機的 ES output {elasticsearch {hosts => [ "localhost:9200" ]} }3. 上面配置了 LogStash 輸出日志到 ES 中,具體字段在后面的筆記中會詳細介紹,這里先用起來再說。
配置完成后就可以通過如下方式啟動 LogStash 了(Linux 下運行?bin/logstash -f logstash-simple.conf?(Windows 上運行bin/logstash.bat -f logstash-simple.conf))
可以看到命令行會打印出如下信息, 可以看到 LogStash 默認端口為 5044:
[2018-03-08T23:12:44,087][WARN ][logstash.config.source.multilocal] Ignoring the 'pipelines.yml' file because modules or command line options are specified [2018-03-08T23:12:44,925][INFO ][logstash.runner ] Starting Logstash {"logstash.version"=>"6.2.2"} [2018-03-08T23:12:45,623][INFO ][logstash.agent ] Successfully started Logstash API endpoint {:port=>9600} [2018-03-08T23:12:49,960][INFO ][logstash.pipeline ] Starting pipeline {:pipeline_id=>"main", "pipeline.workers"=>4, "pipeline.batch.size"=>125, "pipeline.batch.delay"=>50} [2018-03-08T23:12:50,882][INFO ][logstash.outputs.elasticsearch] Elasticsearch pool URLs updated {:changes=>{:removed=>[], :added=>[http://localhost:9200/]}} [2018-03-08T23:12:50,894][INFO ][logstash.outputs.elasticsearch] Running health check to see if an Elasticsearch connection is working {:healthcheck_url=>http://localhost:9200/, :path=>"/"} [2018-03-08T23:12:51,303][WARN ][logstash.outputs.elasticsearch] Restored connection to ES instance {:url=>"http://localhost:9200/"} [2018-03-08T23:12:51,595][INFO ][logstash.outputs.elasticsearch] ES Output version determined {:es_version=>nil} [2018-03-08T23:12:51,604][WARN ][logstash.outputs.elasticsearch] Detected a 6.x and above cluster: the `type` event field won't be used to determine the document _type {:es_version=>6} [2018-03-08T23:12:51,641][INFO ][logstash.outputs.elasticsearch] Using mapping template from {:path=>nil} [2018-03-08T23:12:51,676][INFO ][logstash.outputs.elasticsearch] Attempting to install template {:manage_template=>{"template"=>"logstash-*", "version"=>60001, "settings"=>{"index.refresh_interval"=>"5s"}, "mappings"=>{"_default_"=>{"dynamic_templates"=>[{"message_field"=>{"path_match"=>"message", "match_mapping_type"=>"string", "mapping"=>{"type"=>"text", "norms"=>false}}}, {"string_fields"=>{"match"=>"*", "match_mapping_type"=>"string", "mapping"=>{"type"=>"text", "norms"=>false, "fields"=>{"keyword"=>{"type"=>"keyword", "ignore_above"=>256}}}}}], "properties"=>{"@timestamp"=>{"type"=>"date"}, "@version"=>{"type"=>"keyword"}, "geoip"=>{"dynamic"=>true, "properties"=>{"ip"=>{"type"=>"ip"}, "location"=>{"type"=>"geo_point"}, "latitude"=>{"type"=>"half_float"}, "longitude"=>{"type"=>"half_float"}}}}}}}} [2018-03-08T23:12:51,773][INFO ][logstash.outputs.elasticsearch] New Elasticsearch output {:class=>"LogStash::Outputs::ElasticSearch", :hosts=>["//localhost:9200"]} [2018-03-08T23:12:52,176][INFO ][logstash.filters.geoip ] Using geoip database {:path=>"/Users/zouyingjie/soft/study/ELK/logstash-6.2.2/vendor/bundle/jruby/2.3.0/gems/logstash-filter-geoip-5.0.3-java/vendor/GeoLite2-City.mmdb"} [2018-03-08T23:12:53,026][INFO ][logstash.inputs.beats ] Beats inputs: Starting input listener {:address=>"0.0.0.0:5044"} [2018-03-08T23:12:53,195][INFO ][logstash.pipeline ] Pipeline started succesfully {:pipeline_id=>"main", :thread=>"#<Thread:0x66461e40 run>"} [2018-03-08T23:12:53,290][INFO ][org.logstash.beats.Server] Starting server on port: 5044 [2018-03-08T23:12:53,401][INFO ][logstash.agent ] Pipelines running {:count=>1, :pipelines=>["main"]}?
FileBeats
FileBeats 也提供了下載包,地址為?https://www.elastic.co/downloads/beats/filebeat?。找到系統對應的包下載后解壓即可。
右鍵 選擇?復制鏈接地址?使用?wget?下載?Filebeat.tar.gz?壓縮包。
然后使用?tar -zxvf?命令解壓。
tar -zxvf filebeat-6.2.2-darwin-x86_64.tar.gz cd filebeat-6.2.2-darwin-x86_64進入目錄編輯 filebeat.yml 找到對應的配置項,配置如下
- type: log# Change to true to enable this prospector configuration.enabled: True# Paths that should be crawled and fetched. Glob based paths.# 讀取 Nginx 的日志paths:- /usr/local/nginx/logs/*.log#----------------------------- Logstash output -------------------------------- # 輸出到本機的 LogStash output.logstash:# The Logstash hostshosts: ["localhost:5044"]配置完成后執行如下命令,啟動 FileBeat 即可
# FileBeat 需要以 root 身份啟動,因此先更改配置文件的權限 sudo chown root filebeat.yml sudo ./filebeat -e -c filebeat.yml -d "publish"?
Kibana
百度? ?kibana 使用教程
Kibana查詢語言增強功能:https://www.elastic.co/guide/en/kibana/6.3/kuery-query.html#kuery-query
Kibana 用戶手冊:https://www.elastic.co/guide/cn/kibana/current/index.html
?
安裝步驟:
Kibana 也提供了對應的安裝包下載,鏈接為?https://www.elastic.co/downloads/kibana?, Mac、Linux、Win 都有對應的安裝包,直接下載解壓即可
tar zxvf kibana-6.2.2-darwin-x86_64.tar.gz cd kibana-6.2.2-darwin-x86_64 # 直接啟動即可 bin/kibanaKibana 默認鏈接了本機的 9200 端口,其綁定的端口為 5601,啟動成功后直接訪問 127.0.0.1:5601 端口即可,界面如下。我因為安裝了 x-pack 插件因此顯示的項可能會多一些,這個暫時忽略.
點擊右上方的 Discover. 界面會提示創建索引模式,通過這個來檢索 ES 中的索引,可以看到已經有一個 Logstash 的索引了,輸入名稱進行完全匹配,
這里選定一個時間戳,使用默認的 timestamp 即可,設置完成后我們可以根據時間范圍篩選數據。
設置完成后創建后顯示如下
這時在點擊 Discover 就可以看到我們創建的索引了,此時輸入 UnicodeEncodeError 已經返回了匹配到的日志信息。
至此就完成了簡單的日志分析平臺的搭建。OK,關于安裝就介紹到這里,后面正式開始對整個 ELK Stack 的學習。
?
注意:如果在 discover 里面找不到數據,有可能是時區的問題,可以通過 Management ->?Advanced Settings ->?dateFormat:tz 更改時區,改為 UTC 即可。
?
?
?
快速搭建ELK日志分析系統
?
From:https://blog.csdn.net/e_wsq/article/details/81303713
?
環境
2 臺 Centos 主機 IP:192.168.1.202 安裝: elasticsearch、logstash、Kibana、Nginx、Http、Redis192.168.1.201 安裝: logstash?
安裝
安裝elasticsearch的yum源的密鑰(這個需要在所有服務器上都配置) # rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch配置elasticsearch的yum源 # vim /etc/yum.repos.d/elasticsearch.repo在elasticsearch.repo文件中添加如下內容 [elasticsearch-5.x] name=Elasticsearch repository for 5.x packages baseurl=https://artifacts.elastic.co/packages/5.x/yum gpgcheck=1 gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch enabled=1 autorefresh=1 type=rpm-md?
安裝elasticsearch的環境
安裝elasticsearch # yum install -y elasticsearch安裝java環境(java環境必須是1.8版本以上的)wget http://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u131-linux-x64.rpmrpm -ivh jdk-8u131-linux-x64.rpm 驗證java安裝成功 java -version java version "1.8.0_131" Java(TM) SE Runtime Environment (build 1.8.0_131-b11) Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)創建elasticsearch data的存放目錄,并修改該目錄的屬主屬組
# mkdir -p /data/es-data (自定義用于存放data數據的目錄) # chown -R elasticsearch:elasticsearch /data/es-data修改elasticsearch的日志屬主屬組
# chown -R elasticsearch:elasticsearch /var/log/elasticsearch/修改elasticsearch的配置文件
# vim /etc/elasticsearch/elasticsearch.yml找到配置文件中的cluster.name,打開該配置并設置集群名稱 cluster.name: demon找到配置文件中的node.name,打開該配置并設置節點名稱 node.name: elk-1修改data存放的路徑 path.data: /data/es-data修改logs日志的路徑 path.logs: /var/log/elasticsearch/配置內存使用用交換分區 bootstrap.memory_lock: true監聽的網絡地址 network.host: 0.0.0.0開啟監聽的端口 http.port: 9200增加新的參數,這樣head插件可以訪問es (5.x版本,如果沒有可以自己手動加) http.cors.enabled: true http.cors.allow-origin: "*" 啟動elasticsearch服務啟動服務
/etc/init.d/elasticsearch startStarting elasticsearch: Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x0000000085330000, 2060255232, 0) failed; error='Cannot allocate memory' (errno=12) # # There is insufficient memory for the Java Runtime Environment to continue. # Native memory allocation (mmap) failed to map 2060255232 bytes for committing reserved memory. # An error report file with more information is saved as: # /tmp/hs_err_pid2616.log[FAILED] 這個報錯是因為默認使用的內存大小為2G,虛擬機沒有那么多的空間修改參數: vim /etc/elasticsearch/jvm.options -Xms512m -Xmx512m再次啟動 /etc/init.d/elasticsearch start查看服務狀態,如果有報錯可以去看錯誤日志 less /var/log/elasticsearch/demon.log(日志的名稱是以集群名稱命名的)創建開機自啟動服務 # chkconfig elasticsearch on?
注意事項
需要修改幾個參數,不然啟動會報錯vim /etc/security/limits.conf 在末尾追加以下內容(elk為啟動用戶,當然也可以指定為*) elk soft nofile 65536 elk hard nofile 65536 elk soft nproc 2048 elk hard nproc 2048 elk soft memlock unlimited elk hard memlock unlimited繼續再修改一個參數 vim /etc/security/limits.d/90-nproc.conf 將里面的1024改為2048(ES最少要求為2048) * soft nproc 2048另外還需注意一個問題(在日志發現如下內容,這樣也會導致啟動失敗,這一問題困擾了很久) [2017-06-14T19:19:01,641][INFO ][o.e.b.BootstrapChecks ] [elk-1] bound or publishing to a non-loopback or non-link-local address, enforcing bootstrap checks [2017-06-14T19:19:01,658][ERROR][o.e.b.Bootstrap ] [elk-1] node validation exception [1] bootstrap checks failed [1]: system call filters failed to install; check the logs and fix your configuration or disable system call filters at your own risk解決:修改配置文件,在配置文件添加一項參數(目前還沒明白此參數的作用) vim /etc/elasticsearch/elasticsearch.yml bootstrap.system_call_filter: false通過瀏覽器請求下9200的端口,看下是否成功
先檢查9200端口是否起來 netstat -antp |grep 9200 tcp 0 0 :::9200 :::* LISTEN 2934/java瀏覽器訪問測試是否正常(以下為正常) # curl http://127.0.0.1:9200/ {"name" : "linux-node1","cluster_name" : "demon","cluster_uuid" : "kM0GMFrsQ8K_cl5Fn7BF-g","version" : {"number" : "5.4.0","build_hash" : "780f8c4","build_date" : "2017-04-28T17:43:27.229Z","build_snapshot" : false,"lucene_version" : "6.5.0"},"tagline" : "You Know, for Search" }?
如何和elasticsearch交互
JavaAPIRESTful API Javascript,.Net,PHP,Perl,Python利用API查看狀態 # curl -i -XGET 'localhost:9200/_count?pretty' HTTP/1.1 200 OKcontent-type: application/json; charset=UTF-8content-length: 95{"count" : 0,"_shards" : {"total" : 0,"successful" : 0,"failed" : 0}}?
安裝插件
安裝elasticsearch-head插件安裝docker鏡像或者通過github下載elasticsearch-head項目都是可以的,1或者2兩種方式選擇一種安裝使用即可1. 使用docker的集成好的elasticsearch-head# docker run -p 9100:9100 mobz/elasticsearch-head:5docker容器下載成功并啟動以后,運行瀏覽器打開http://localhost:9100/2. 使用git安裝elasticsearch-head# yum install -y npm# git clone git://github.com/mobz/elasticsearch-head.git# cd elasticsearch-head# npm install# npm run start檢查端口是否起來netstat -antp |grep 9100瀏覽器訪問測試是否正常http://IP:9100/截圖:
?
LogStash的使用
安裝Logstash環境:官方安裝手冊: https://www.elastic.co/guide/en/logstash/current/installing-logstash.html下載yum源的密鑰認證: # rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch利用yum安裝logstash # yum install -y logstash查看下logstash的安裝目錄 # rpm -ql logstash創建一個軟連接,每次執行命令的時候不用在寫安裝路勁(默認安裝在/usr/share下) ln -s /usr/share/logstash/bin/logstash /bin/執行logstash的命令 # logstash -e 'input { stdin { } } output { stdout {} }'運行成功以后輸入: nihaostdout返回的結果:截圖:
注:-e 執行操作input 標準輸入{ input } 插件output 標準輸出{ stdout } 插件 通過rubydebug來輸出下更詳細的信息 # logstash -e 'input { stdin { } } output { stdout {codec => rubydebug} }'執行成功輸入: nihaostdout輸出的結果: 如果標準輸出還有elasticsearch中都需要保留應該怎么玩,看下面 # /usr/share/logstash/bin/logstash -e 'input { stdin { } } output { elasticsearch { hosts => ["192.168.1.202:9200"] } stdout { codec => rubydebug }}'運行成功以后輸入: I am elk返回的結果(標準輸出中的結果):?
logstash使用配置文件
官方指南: https://www.elastic.co/guide/en/logstash/current/configuration.html創建配置文件01-logstash.conf # vim /etc/logstash/conf.d/elk.conf文件中添加以下內容 input { stdin { } } output {elasticsearch { hosts => ["192.168.1.202:9200"] }stdout { codec => rubydebug } }使用配置文件運行logstash # logstash -f ./elk.conf運行成功以后輸入以及標準輸出結果?
logstash的數據庫類型
1. Input插件權威指南:https://www.elastic.co/guide/en/logstash/current/input-plugins.htmlfile插件的使用# vim /etc/logstash/conf.d/elk.conf添加如下配置input {file {path => "/var/log/messages"type => "system"start_position => "beginning"}}output { elasticsearch {hosts => ["192.168.1.202:9200"]index => "system-%{+YYYY.MM.dd}"}}運行logstash指定elk.conf配置文件,進行過濾匹配 #logstash -f /etc/logstash/conf.d/elk.conf來一發配置安全日志的并且把日志的索引按類型做存放,繼續編輯elk.conf文件
# vim /etc/logstash/conf.d/elk.conf添加secure日志的路徑 input {file {path => "/var/log/messages"type => "system"start_position => "beginning"}file {path => "/var/log/secure"type => "secure"start_position => "beginning"} }output {if [type] == "system" {elasticsearch {hosts => ["192.168.1.202:9200"]index => "nagios-system-%{+YYYY.MM.dd}"}}if [type] == "secure" {elasticsearch {hosts => ["192.168.1.202:9200"]index => "nagios-secure-%{+YYYY.MM.dd}"}} }運行logstash指定elk.conf配置文件,進行過濾匹配 # logstash -f ./elk.conf這些設置都沒有問題之后,接下來安裝下kibana,可以讓在前臺展示
?
Kibana的安裝及使用
安裝kibana環境官方安裝手冊:https://www.elastic.co/guide/en/kibana/current/install.html下載kibana的tar.gz的軟件包 # wget https://artifacts.elastic.co/downloads/kibana/kibana-5.4.0-linux-x86_64.tar.gz解壓kibana的tar包 # tar -xzf kibana-5.4.0-linux-x86_64.tar.gz進入解壓好的kibana # mv kibana-5.4.0-linux-x86_64 /usr/local創建kibana的軟連接 # ln -s /usr/local/kibana-5.4.0-linux-x86_64/ /usr/local/kibana 編輯kibana的配置文件 # vim /usr/local/kibana/config/kibana.yml修改配置文件如下,開啟以下的配置 server.port: 5601server.host: "0.0.0.0"elasticsearch.url: "http://192.168.1.202:9200"kibana.index: ".kibana" 安裝screen,以便于kibana在后臺運行(當然也可以不用安裝,用其他方式進行后臺啟動) # yum -y install screen# screen# /usr/local/kibana/bin/kibana netstat -antp |grep 5601 tcp 0 0 0.0.0.0:5601 0.0.0.0:* LISTEN 17007/node 打開瀏覽器并設置對應的index http://IP:5601?
?
二、ELK實戰篇
?
好,現在索引也可以創建了,現在可以來輸出nginx、apache、message、secrue的日志到前臺展示(Nginx有的話直接修改,沒有自行安裝)
編輯nginx配置文件,修改以下內容(在http模塊下添加)log_format json '{"@timestamp":"$time_iso8601",''"@version":"1",''"client":"$remote_addr",''"url":"$uri",''"status":"$status",''"domian":"$host",''"host":"$server_addr",''"size":"$body_bytes_sent",''"responsetime":"$request_time",''"referer":"$http_referer",''"ua":"$http_user_agent"''}';修改access_log的輸出格式為剛才定義的json access_log logs/elk.access.log json;繼續修改apache的配置文件LogFormat "{ \\"@timestamp\": \"%{%Y-%m-%dT%H:%M:%S%z}t\", \\"@version\": \"1\", \\"tags\":[\"apache\"], \\"message\": \"%h %l %u %t \\\"%r\\\" %>s %b\", \\"clientip\": \"%a\", \\"duration\": %D, \\"status\": %>s, \\"request\": \"%U%q\", \\"urlpath\": \"%U\", \\"urlquery\": \"%q\", \\"bytes\": %B, \\"method\": \"%m\", \\"site\": \"%{Host}i\", \\"referer\": \"%{Referer}i\", \\"useragent\": \"%{User-agent}i\" \}" ls_apache_json一樣修改輸出格式為上面定義的json格式 CustomLog logs/access_log ls_apache_json編輯logstash配置文件,進行日志收集 vim /etc/logstash/conf.d/full.confinput {file {path => "/var/log/messages"type => "system"start_position => "beginning"} file {path => "/var/log/secure"type => "secure"start_position => "beginning"} file {path => "/var/log/httpd/access_log"type => "http"start_position => "beginning"} file {path => "/usr/local/nginx/logs/elk.access.log"type => "nginx"start_position => "beginning"} }output {if [type] == "system" { elasticsearch {hosts => ["192.168.1.202:9200"]index => "nagios-system-%{+YYYY.MM.dd}"} } if [type] == "secure" {elasticsearch {hosts => ["192.168.1.202:9200"]index => "nagios-secure-%{+YYYY.MM.dd}"}}if [type] == "http" {elasticsearch {hosts => ["192.168.1.202:9200"]index => "nagios-http-%{+YYYY.MM.dd}"}}if [type] == "nginx" {elasticsearch {hosts => ["192.168.1.202:9200"]index => "nagios-nginx-%{+YYYY.MM.dd}"}}}運行看看效果如何 logstash -f /etc/logstash/conf.d/full.conf可以發現所有創建日志的索引都已存在,接下來就去Kibana創建日志索引,進行展示(按照上面的方法進行創建索引即可),看下展示的效果
接下來再來一發MySQL慢日志的展示
由于MySQL的慢日志查詢格式比較特殊,所以需要用正則進行匹配,并使用multiline能夠進行多行匹配(看具體配置) input {file {path => "/var/log/messages"type => "system"start_position => "beginning"} file {path => "/var/log/secure"type => "secure"start_position => "beginning"} file {path => "/var/log/httpd/access_log"type => "http"start_position => "beginning"} file {path => "/usr/local/nginx/logs/elk.access.log"type => "nginx"start_position => "beginning"} file {path => "/var/log/mysql/mysql.slow.log"type => "mysql"start_position => "beginning" codec => multiline {pattern => "^# User@Host:"negate => truewhat => "previous"}} }filter {grok {match => { "message" => "SELECT SLEEP" }add_tag => [ "sleep_drop" ]tag_on_failure => []}if "sleep_drop" in [tags] {drop {}}grok {match => { "message" => "(?m)^# User@Host: %{USER:User}\[[^\]]+\] @ (?:(?<clienthost>\S*) )?\[(?:%{IP:Client_IP})?\]\s.*# Query_time: %{NUMBER:Query_Time:float}\s+Lock_time: %{NUMBER:Lock_Time:float}\s+Rows_sent: %{NUMBER:Rows_Sent:int}\s+Rows_examined: %{NUMBER:Rows_Examined:int}\s*(?:use %{DATA:Database};\s*)?SET timestamp=%{NUMBER:timestamp};\s*(?<Query>(?<Action>\w+)\s+.*)\n# Time:.*$" }}date {match => [ "timestamp", "UNIX" ]remove_field => [ "timestamp" ]}}output {if [type] == "system" { elasticsearch {hosts => ["192.168.1.202:9200"]index => "nagios-system-%{+YYYY.MM.dd}"} } if [type] == "secure" {elasticsearch {hosts => ["192.168.1.202:9200"]index => "nagios-secure-%{+YYYY.MM.dd}"}}if [type] == "http" {elasticsearch {hosts => ["192.168.1.202:9200"]index => "nagios-http-%{+YYYY.MM.dd}"}}if [type] == "nginx" {elasticsearch {hosts => ["192.168.1.202:9200"]index => "nagios-nginx-%{+YYYY.MM.dd}"}}if [type] == "mysql" {elasticsearch {hosts => ["192.168.1.202:9200"]index => "nagios-mysql-slow-%{+YYYY.MM.dd}"}} }查看效果(一條慢日志查詢會顯示一條,如果不進行正則匹配,那么一行就會顯示一條)
具體的日志輸出需求,進行具體的分析
?
?
三:ELK終極篇
安裝reids # yum install -y redis修改redis的配置文件 # vim /etc/redis.conf修改內容如下 daemonize yesbind 192.168.1.202啟動redis服務 # /etc/init.d/redis restart測試redis的是否啟用成功 # redis-cli -h 192.168.1.202輸入info如果有不報錯即可 redis 192.168.1.202:6379> inforedis_version:2.4.10 ....編輯配置redis-out.conf配置文件,把標準輸入的數據存儲到redis中 # vim /etc/logstash/conf.d/redis-out.conf添加如下內容input {stdin {} }output {redis {host => "192.168.1.202"port => "6379"password => 'test'db => '1'data_type => "list"key => 'elk-test'} } 運行logstash指定redis-out.conf的配置文件 # /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/redis-out.conf運行成功以后,在logstash中輸入內容(查看下效果)
編輯配置redis-in.conf配置文件,把reids的存儲的數據輸出到elasticsearch中 # vim /etc/logstash/conf.d/redis-out.conf添加如下內容 input{redis {host => "192.168.1.202"port => "6379"password => 'test'db => '1'data_type => "list"key => 'elk-test'batch_count => 1 #這個值是指從隊列中讀取數據時,一次性取出多少條,默認125條(如果redis中沒有125條,就會報錯,所以在測試期間加上這個值)}}output {elasticsearch {hosts => ['192.168.1.202:9200']index => 'redis-test-%{+YYYY.MM.dd}'} }運行logstash指定redis-in.conf的配置文件 # /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/redis-out.conf 把之前的配置文件修改一下,變成所有的日志監控的來源文件都存放到redis中,然后通過redis在輸出到elasticsearch中更改為如下,編輯full.conf input {file {path => "/var/log/httpd/access_log"type => "http"start_position => "beginning"}file {path => "/usr/local/nginx/logs/elk.access.log"type => "nginx"start_position => "beginning"}file {path => "/var/log/secure"type => "secure"start_position => "beginning"}file {path => "/var/log/messages"type => "system"start_position => "beginning"} }output {if [type] == "http" {redis {host => "192.168.1.202"password => 'test'port => "6379"db => "6"data_type => "list"key => 'nagios_http' }}if [type] == "nginx" {redis {host => "192.168.1.202"password => 'test'port => "6379"db => "6"data_type => "list"key => 'nagios_nginx' }}if [type] == "secure" {redis {host => "192.168.1.202"password => 'test'port => "6379"db => "6"data_type => "list"key => 'nagios_secure' }}if [type] == "system" {redis {host => "192.168.1.202"password => 'test'port => "6379"db => "6"data_type => "list"key => 'nagios_system' }} } 運行logstash指定shipper.conf的配置文件 # /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/full.conf在redis中查看是否已經將數據寫到里面(有時候輸入的日志文件不產生日志,會導致redis里面也沒有寫入日志) 把redis中的數據讀取出來,寫入到elasticsearch中(需要另外一臺主機做實驗)編輯配置文件 # vim /etc/logstash/conf.d/redis-out.conf添加如下內容 input {redis {type => "system"host => "192.168.1.202"password => 'test'port => "6379"db => "6"data_type => "list"key => 'nagios_system' batch_count => 1}redis {type => "http"host => "192.168.1.202"password => 'test'port => "6379"db => "6"data_type => "list"key => 'nagios_http' batch_count => 1}redis {type => "nginx"host => "192.168.1.202"password => 'test'port => "6379"db => "6"data_type => "list"key => 'nagios_nginx'batch_count => 1}redis {type => "secure"host => "192.168.1.202"password => 'test'port => "6379"db => "6"data_type => "list"key => 'nagios_secure' batch_count => 1} }output {if [type] == "system" {elasticsearch {hosts => ["192.168.1.202:9200"]index => "nagios-system-%{+YYYY.MM.dd}"}} if [type] == "http" {elasticsearch {hosts => ["192.168.1.202:9200"]index => "nagios-http-%{+YYYY.MM.dd}"} } if [type] == "nginx" {elasticsearch {hosts => ["192.168.1.202:9200"]index => "nagios-nginx-%{+YYYY.MM.dd}"} } if [type] == "secure" {elasticsearch {hosts => ["192.168.1.202:9200"]index => "nagios-secure-%{+YYYY.MM.dd}"} } }注意: input是從客戶端收集的 output是同樣也保存到192.168.1.202中的elasticsearch中,如果要保存到當前的主機上,可以把output中的hosts修改成localhost,如果還需要在kibana中顯示,需要在本機上部署kabana,為何要這樣做,起到一個松耦合的目的 說白了,就是在客戶端收集日志,寫到服務端的redis里或是本地的redis里面,輸出的時候對接ES服務器即可運行命令看看效果 # /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/redis-out.conf效果是和直接往ES服務器輸出一樣的(這樣是先將日志存到redis數據庫,然后再從redis數據庫里取出日志)
?
上線 ELK
1. 日志分類系統日志 rsyslog logstash syslog插件訪問日志 nginx logstash codec json錯誤日志 file logstash mulitline運行日志 file logstash codec json設備日志 syslog logstash syslog插件Debug日志 file logstash json 或者 mulitline 2. 日志標準化路徑 固定格式 盡量json3. 系統個日志開始-->錯誤日志-->運行日志-->訪問日志因為ES保存日志是永久保存,所以需要定期刪除一下日志,下面命令為刪除指定時間前的日志
curl -X DELETE http://xx.xx.com:9200/logstash-*-`date +%Y-%m-%d -d "-$n days"`?
?
?
?
?
?
?
總結
- 上一篇: 22条API设计的实践
- 下一篇: windows 远程执行 cmd 命令的