#filebeat官網下載地址
https://www.elastic.co/downloads/past-releases/filebeat-5-3-2
#-----Filebeat的架構分析、配置解釋與示例 -----
#reference from: http://blog.csdn.net/gamer_gyt/article/details/52688636
在看filebeat之前先來看下Beats,Beats 平臺是 Elastic.co 從 packetbeat 發展出來的數據收集器系統。beat 收集器可以直接寫入 Elasticsearch,也可以傳輸給 Logstash。其中抽象出來的 libbeat,提供了統一的數據發送方法,輸入配置解析,日志記錄框架等功能。也就是說,所有的 beat 工具,在配置上,除了 input 以外,在output、filter、shipper、logging、run-options 上的配置規則都是完全一致的
而這里的filebeat就是beats 的一員,目前beat可以發送數據給Elasticsearch,Logstash,File,Console四個目的地址。filebeat 是基于原先 logstash-forwarder 的源碼改造出來的。換句話說:filebeat 就是新版的 logstash-forwarder,也會是 ELK Stack 在 shipper 端的第一選擇
整體架構理解:
上邊我們也說了filebeat是用來收集日志的,那么在filebeat.yml中會配置指定的監聽文件,也就是上圖中的一個個log,這個log的目錄是在prospectors中設? 置,在看配置文件的時候便可以很明白的看出來,對于prospectors定位每個日志文件,Filebeat啟動harvester。每個harvester讀取新的內容一個日志文件,新的日志數據發送到spooler(后臺處理程序),它匯集的事件和聚合數據發送到你已經配置了Filebeat輸出。
安裝步驟略了,在啟動filebeat服務之前,需要先修改配置文件.
#reference from: https://www.ibm.com/developerworks/cn/opensource/os-cn-elk-filebeat/index.html
#ELK 不是一款軟件,而是 Elasticsearch、Logstash 和 Kibana 三種軟件產品的首字母縮寫。這三者都是開源軟件,通常配合使用,而且又先后歸于 Elastic.co 公司名下,所以被簡稱為 ELK Stack。根據 Google Trend 的信息顯示,ELK Stack 已經成為目前最流行的集中式日志解決方案。
#Beats 作為日志搜集器
這種架構引入 Beats 作為日志搜集器。目前 Beats 包括四種:
Packetbeat(搜集網絡流量數據);
Topbeat(搜集系統、進程和文件系統級別的 CPU 和內存使用情況等數據);
Filebeat(搜集文件數據);
Winlogbeat(搜集 Windows 事件日志數據)。
#Filebeat 實現 log rotation
通俗的說,log rotation 是指當日志文件達到指定大小后,把隨后的日志寫到新的日志文件中,原來的日志文件重命名,加上日志的起止時間,以實現日志歸檔的目的。
Filebeat 默認支持 log rotation,但需要注意的是,Filebeat 不支持使用 NAS 或掛載磁盤保存日志的情況。因為在 Linux 系列的操作系統中,Filebeat使用文件的inode信息會變化,導致 Filebeat 無法完整讀取 log。
雖然 Filebeat 默認支持 log rotation,但是有三個參數的設置需要留意。
registry_file:這個文件記錄了當前打開的所有 log 文件,以及每個文件的 inode、當前讀取位置等信息。當 Filebeat 拿到一個 log 文件,首先查找 registry_file,如果是舊文件,就從記錄的當前讀取位置處開始讀取;如果是新文件,則從開始位置讀取;
close_older:如果某個日志文件經過 close_older 時間后沒有修改操作,Filebeat 就關閉該文件的 handler。如果該值過長,則隨著時間推移,Filebeat 打開的文件數量很多,耗費系統內存;
scan_frequency:Filebeat 每隔 scan_frequency 時間讀取一次文件內容。對于關閉的文件,如果后續有更新,則經過 scan_frequency 時間后,Filebeat 將重新打開該文件,讀取新增加的內容。
#Elasticsearch 集群:
#Elasticsearch 啟動時會根據配置文件中設置的集群名字(cluster.name)自動查找并加入集群。Elasctisearch 節點默認使用 9300 端口尋找集群,所以必須開啟這個端口。
#一個 Elasticsearch 集群中一般擁有三種角色的節點,master、data 和 client。
master:master 節點負責一些輕量級的集群操作,比如創建、刪除數據索引、跟蹤記錄集群中節點的狀態、決定數據分片(shards)在 data 節點之間的分布;
data:data 節點上保存了數據分片。它負責數據相關操作,比如分片的 CRUD,以及搜索和整合操作。這些操作都比較消耗 CPU、內存和 I/O 資源;
client:client 節點起到路由請求的作用,實際上可以看做負載均衡器。
#配置文件中有兩個與集群相關的配置:
node.master:默認 true。True 表示該節點是 master 節點;
node.data:默認 true。True 表示該節點時 data 節點。如果兩個值都為 false,表示是 client 節點。
#一個集群中不一定有 client 節點,但是肯定有 master 和 data 節點。默認第一個啟動的節點是 master。Master 節點也能起到路由請求和搜索結果整合的作用,所以在小規模的集群中,無需 client 節點。但是如果集群規模很大,則有必要設置專門的 client。
#Logstash 使用 grok 過濾
#日志數據一般都是非結構化數據,而且包含很多不必要的信息,所以需要在 Logstash 中添加過濾插件對 Filebeat 發送的數據進行結構化處理。
使用 grok 正則匹配把那些看似毫無意義、非結構化的日志數據解析成可查詢的結構化數據,是目前 Logstash 解析過濾的最好方式。
Grok 的用戶不需要從頭開始寫正則。ELK github 上已經寫好了很多有用的模式,比如日期、郵箱地址、IP4/6、URL 等。具體查看這里(https://github.com/logstash-plugins/logstash-patterns-core/blob/master/patterns/grok-patterns)
#問題:Filebeat 如何讀取多個日志目錄?
解決方案:通過配置多個 prospector 就能達到要求。在配置文件的 prospectors 下,每個"-"表示一個 prospector,每個 prospector 包含一些配置項,指明這個 prospector 所要讀取的日志信息。如下所示:
prospectors:
-
paths:
- /home/WLPLog/*.log
# 其他配置項,具體參考 Elastic 官網
-
paths:
- /home/ApacheLog/*.log
# 其他配置項,具體參考 Elastic 官網
#問題:Filebeat 如何區分不同日志來源?
#Filebeat 雖然能讀取不同的日志目錄,但是在 Logstash 這邊,或者是 Elasticsearch 這邊,怎么區分不同 application server 的日志數據呢?
#解決方案:Filebeat 的配置項 fields 可以實現不同日志來源的區分。用法如下:
prospectors:
-
paths:
- /home/WLPLog/*.log
fields:
log_source: WLP
-
paths:
- /home/ApacheLog/*.log
fields:
log_source: Apache
#解析:在 fields 配置項中,用戶可以自定義域來標識不同的 log。比如上例中的"log_source"就是自己自定義的。如此,從 Filebeat 輸出的 log 就有一個叫做 log_source 的域表明該 log 的實際來源。
#問題:如何配置 Logstash 與 Elasticsearch 集群通信?
我們知道 Logstash 使用 Elasticsearch 輸出插件就能把數據發送到 Elasticsearch 進行存儲和搜索。Elasticsearch 插件中有個 hosts 配置項說明 Elasticsearch 信息。但是假如是一個 Elasticsearch 集群,應該怎么配置 hosts?
#解決方案:最簡單的做法是把集群中所有的 Elasticsearch 節點的 IP 或者是 hostname 信息都在 hosts 中配上(它支持數組)。但是如果集群比較大,或者是集群節點變動頻繁的話,還需要維護這個 hosts 值,不太方便。比較推薦的做法是只配集群中某個節點的信息,可以是 client 節點,也可以是 master 節點或者是 data 節點。因為不管是哪個節點,都知道該它所在集群的信息(集群規模,各節點角色)。這樣,Logstash 與任意節點通信時都會先拿到集群信息,然后再決定應該給哪個節點發送數據輸出請求。
#參考資料:
#參考使用 Nginx 實現 Kibana 登陸認證博客,學習如何配置 Nginx 作為 Kibana 的反向代理,且實現登陸認證;
#reference from: http://www.cnblogs.com/yjmyzz/p/filebeat-turorial-and-kibana-login-setting-with-nginx.html
1修改filebeat下的filebeat.yml文件模板:
filebeat:
prospectors:
-
paths:
- "/var/log/nginx/*.log"
input_type: log
document_type: nginx-access
-
paths:
- "/data/log/order/*.log"
input_type: log
document_type: order-service
-
paths:
- "/opt/service/zhifu/logs/*.log"
input_type: log
document_type: zhifu-service
output:
elasticsearch:
hosts: ["localhost:9200"]
logging:
files:
rotateeverybytes: 10485760
2設置elasticsearch的filebeat模板:
#curl -XPUT 'http://localhost:9200/_template/filebeat?pretty' -d@/etc/filebeat/filebeat.template.json
#注:上面localhost:9200改成實際的elasticsearch的地址,后面的一串為filebeat根目錄下的filebeat.template.json的完整路徑,順利的話,會返回:
{
"acknowledged" : true
}
#表示模板已被接收。
3啟動:
#./filebeat -e -c filebeat.yml -d "Publish"
#如果能看到一堆東西輸出,表示正在向elastic search發送日志。
#測試正常后,Ctrl+C結束,然后用
#nohup ./filebeat -e -c filebeat.yml >/dev/null 2>&1 &
#轉入后臺運行,最后到kibana里,創建一個索引,注意pattern為:filebeat-*
#kibana的登錄認證問題:
#kibana是nodejs開發的,本身并沒有任何安全限制,直接瀏覽url就能訪問,如果公網環境非常不安全,可以通過nginx請求轉發增加認證,方法如下:
#tips:kibana沒有重啟命令,要重啟,只能ps -ef|grep node 查找nodejs進程,干掉重來。
1#參考以下內容,修改配置文件:
server {
listen? ? ? 80;
server_name syste1.example.com;
location / {
auth_basic "secret";
auth_basic_user_file /data/nginx/db/passwd.db;
proxy_pass http://localhost:5601;
proxy_set_header Host $host:5601;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Via "nginx";
}
access_log off;
}
#上面的配置表示將syste1.example.com的請求,轉發到服務器的5601端口,同時使用最基本的用戶名、密碼來認證。
#2、配置登錄用戶名,密碼
#htpasswd -c /data/nginx/db/passwd.db user1
#注意passwd.db的路徑要跟nginx配置中的一致,最后的user1為用戶名,可以隨便改,輸入完該命令后,系統會提示輸入密碼,搞定后passwd.db中就有加密后的密碼了,有興趣的可以cat看下。提示:htpasswd是apache自帶的小工具,如果找不到該命令,嘗試用yum install httpd安裝
#3、關掉kibana端口的外網訪問
#用nginx轉發后,一定要記得配置iptables之類的防火墻,禁止外部直接訪問5601端口,這樣就只能通過nginx來訪問了。
#-----ElasticSearch 集群環境檢查-時鐘同步-----
#1.設置本地時間
#cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
2.集群時間日期同步NTP
#yum install ntp
ntpdate pool.ntp.org