當我們公司內部部署很多服務以及測試、正式環境的時候,查看日誌就變成了一個非常剛需的需求了。是多個環境的日誌統一收集,然後使用 Nginx 對外提供服務,還是使用專用的日誌收集服務 ELK 呢?這就變成了一個問題!而 Graylog 作為整合方案,使用 elasticsearch 來存儲,使用 mongodb 來緩存,並且還有帶流量控制的 (throttling),同時其界面查詢簡單易用且易於擴展。所以,使用 Graylog 成為了不二之選,為我們省了不少心。
服務日誌收集方案:Filebeat + Graylog!
Filebeat 是一個日誌文件託運工具,在你的伺服器上安裝客戶端後,filebeat 會自動監控給定的日誌目錄或者指定的日誌文件,追蹤讀取這些文件,不停的讀取,並且轉發這些信息到 elasticsearch 或者 logstarsh 或者 graylog 中存放。
當你安裝並啟用 filebeat 程序的時候,它會啟動一個或多個探測器(prospectors)去檢測你指定的日誌目錄或文件,對於探測器找出的每一個日誌文件,filebeat 都會啟動一個收割進程(harvester),每一個收割進程讀取一個日誌文件的最新內容,並發送這些新的日誌數據到處理程序(spooler),處理程序會集合這些事件,最後 filebeat 會發送集合的數據到你指定的地址上去(我們這裡就是發送給graylog服務了)。
我們這裡不適用 logstash 服務,主要是因為 filebeat 相比於 logstash 更加輕量級。當我們需要收集信息的機器配置或資源並不是特別多時,且並沒有那麼複雜的時候,還是建議使用 filebeat 來收集日誌。日常使用中,filebeat 的安裝部署方式多樣且運行十分穩定。
圖示服務架構理解記憶
2. Filebeat 配置文件配置 Filebeat 工具的核心就是如何編寫其對應的配置文件!
對應 Filebeat 工具的配置主要是通過編寫其配置文件來控制的,對於通過 rpm 或者 deb 包來安裝的情況,配置文件默認會存儲在,/etc/filebeat/filebeat.yml 這個路徑下面。而對於,對於 MAC 或者 Win 系統來說,請查看解壓文件中相關文件,其中都有涉及。
下面展示了 Filebeat 工具的主配置文件,注釋信息中都對其各個欄位含義進行了詳細的解釋,我這裡就不再贅述了。需要注意的是,我們將日誌的輸入來源統統定義去讀取 inputs.d 目錄下的所有 yml 配置。所以,我們可以更加不用的服務(測試、正式服務)來定義不同的配置文件,根據物理機部署的實際情況具體配置。
# 配置輸入來源的日誌信息
# 我們合理將其配置到了inputs.d目錄下的所有yml文件
filebeat.config.inputs:
enabled: true
path: ${path.config}/inputs.d/*.yml
# 若收取日誌格式為json的log請開啟此配置
# json.keys_under_root: true
# 配置filebeat需要加載的模塊
filebeat.config.modules:
path: ${path.config}/modules.d/*.yml
reload.enabled: false
setup.template.settings:
index.number_of_shards: 1
# 配置將日誌信息發送那個地址上面
output.logstash:
hosts: ["11.22.33.44:5500"]
# output.file:
# enable: true
processors:
- add_host_metadata: ~
- rename:
fields:
- from: "log"
to: "message"
- add_fields:
target: ""
fields:
# 加token是為了防止無認證的服務上Graylog服務發送數據
token: "0uxxxxaM-1111-2222-3333-VQZJxxxxxwgX "
下面展示一個簡單的 inputs.d 目錄下面的 yml 配置文件的具體內容,其主要作用就是配置單獨服務的獨立日誌數據,以及追加不同的數據 tag 類型。
# 收集的數據類型
- type: log
enabled: true
# 日誌文件的路徑地址
paths:
- /var/log/supervisor/app_escape_worker-stderr.log
- /var/log/supervisor/app_escape_prod-stderr.log
symlinks: true
# 包含的關鍵字信息
include_lines: ["WARNING", "ERROR"]
# 打上數據標籤
tags: ["app", "escape", "test"]
# 防止程序堆棧信息被分行識別
multiline.pattern: '^\[?[0-9]...{3}'
multiline.negate: true
multiline.match: after
# 需要配置多個日誌時可加多個type欄位
- type: log
enabled: true
.
需要注意的是,針對於不同的日誌類型,filebeat 還提供了不同了模塊來配置不同的服務日誌以及其不同的模塊特性,比如我們常見的 PostgreSQl、Redis、Iptables 等。
# iptables
- module: iptables
log:
enabled: true
var.paths: ["/var/log/iptables.log"]
var.input: "file"
# postgres
- module: postgresql
log:
enabled: true
var.paths: ["/path/to/log/postgres/*.log*"]
# nginx
- module: nginx
access:
enabled: true
var.paths: ["/path/to/log/nginx/access.log*"]
error:
enabled: true
var.paths: ["/path/to/log/nginx/error.log*"]
服務日誌收集方案:Filebeat + Graylog!
Graylog 是一個開源的日誌聚合、分析、審計、展現和預警工具。在功能上來說,和 ELK 類似,但又比 ELK 要簡單很多。依靠著更加簡潔,高效,部署使用簡單的優勢很快受到許多人的青睞。當然,在擴展性上面確實沒有比 ELK 好,但是其有商業版本可以選擇。
部署 graylog 最簡單的架構就是單機部署,複雜的也是部署集群模式,架構圖示如下所示。我們可以看到其中包含了三個組件,分別是 Elasticsearch、MongoDb 和 Graylog。其中,Elasticsearch 用來持久化存儲和檢索日誌文件數據(IO 密集),MongoDb 用來存儲關於 Graylog 的相關配置,而 Graylog 來提供 Web 界面和對外接口的(CPU 密集)。
最小化單機部署
最優化集群部署
4. Graylog 組件功能
配置 Graylog 服務的核心就是理解對應組件的功能以及其運作方式!
簡單來講,Input 表示日誌數據的來源,對不同來源的日誌可以通過 Extractors 來進行日誌的欄位轉換,比如將 Nginx 的狀態碼變成對應的英文表述等。然後,通過不同的標籤類型分組成不用的 Stream,並將這些日誌數據存儲到指定的 Index 庫中進行持久化保存。
編號組件名稱功能介紹主要特點1Dashboards數據面板固定展示主要是用來保存特定搜索條件的數據面板2Searching日誌信息條件搜索關鍵字搜索、時間搜索、搜索保存、創建面板、分組查詢、結果導出、查詢高亮顯示、自定義時間3Alert設置告警提示方式支持郵件告警、HTTP 回調和自定義腳本觸發4Inputs日誌數據抓取接收部署 Sidercar 主動抓取或使用其他服務被動上報5Extractors日誌數據格式轉換json 解析、kv 解析、時間戳解析、正則解析6Streams日誌信息分類分組設置日誌分類條件並發送到不同的索引文件中去7Indices持久化數據存儲設置數據存儲性能8Outputs日誌數據的轉發解析的 Stream 發送到其他 Graylog 集群或服務9Pipelines日誌數據的過濾建立數據清洗的過濾規則、欄位添加刪除、條件過濾、自定義函數等10Sidecar輕量級的日誌採集器相當於 C/S 模式;大規模時使用11Lookup Tables服務解析基於 IP 的 Whois 查詢和基於來源 IP 的情報監控12Geolocation可視化地理位置實現基於來源 IP 的情報監控Graylog中的核心服務組件
Graylog 通過 Input 搜集日誌,每個 Input 單獨配置 Extractors 用來做欄位轉換。Graylog 中日誌搜索的基本單位是 Stream,每個 Stream 可以有自己單獨的 Elastic Index Set,也可以共享一個 Index Set。
Extractor 在 System/Input 中配置。Graylog 中很方便的一點就是可以加載一條日誌,然後基於這個實際的例子進行配置並能直接看到結果。內置的 Extractor 基本可以完成各種欄位提取和轉換的任務,但是也有些限制,在應用裡寫日誌的時候就需要考慮到這些限制。Input 可以配置多個 Extractors,按照順序依次執行。
系統會有一個默認的 Stream,所有日誌默認都會保存到這個 Stream 中,除非匹配了某個 Stream,並且這個 Stream 裡配置了不保存日誌到默認 Stream。可以通過菜單 Streams 創建更多的 Stream,新創建的 Stream 是暫停狀態,需要在配置完成後手動啟動。Stream 通過配置條件匹配日誌,滿足條件的日誌添加 stream ID 標識欄位並保存到對應的 Elastic Index Set 中。
Index Set 通過菜單 System/Indices 創建。日誌存儲的性能,可靠性和過期策略都通過 Index Set 來配置。性能和可靠性就是配置 Elastic Index 的一些參數,主要參數包括,Shards 和 Replicas。
除了上面提到的日誌處理流程,Graylog 還提供了 Pipeline 腳本實現更靈活的日誌處理方案。這裡不詳細闡述,只介紹如果使用 Pipelines 來過濾不需要的日誌。下面是丟棄 level > 6 的所有日誌的 Pipeline Rule 的例子。從數據採集(input),欄位解析(extractor),分流到 stream,再到 pipeline 的清洗,一氣呵成,無需在通過其他方式進行二次加工。
Sidecar 是一個輕量級的日誌採集器,通過訪問 graylog 進行集中式管理,支持 linux 和 windows 系統。Sidecar 守護進程會定期訪問 graylog 的 REST API 接口獲取 Sidecar 配置文件中定義的標籤(tag) ,Sidecar 在首次運行時會從 graylog 伺服器拉取配置文件中指定標籤(tag) 的配置信息同步到本地。目前 Sidecar 支持 NXLog,Filebeat 和 Winlogbeat。他們都通過 graylog 中的 web 界面進行統一配置,支持 Beats、CEF、Gelf、Json API、NetFlow 等輸出類型。Graylog 最厲害的在於可以在配置文件中指定 Sidecar 把日誌發送到哪個 graylog 群集,並對 graylog 群集中的多個 input 進行負載均衡,這樣在遇到日誌量非常龐大的時候,graylog 也能應付自如。
rule "discard debug messages"
when
to_long($message.level) > 6
then
drop_message();
end
日誌集中保存到 Graylog 後就可以方便的使用搜索了。不過有時候還是需要對數據進行近一步的處理。主要有兩個途徑,分別是直接訪問 Elastic 中保存的數據,或者通過 Graylog 的 Output 轉發到其它服務。
5. 服務安裝和部署主要介紹部署 Filebeat + Graylog 的安裝步驟和注意事項!
使用Graylog來收集日誌
官方提供了多種的部署方式,包括通過 rpm 和 deb 包安裝服務,以及原始碼編譯的方式安裝服務,同時包括了使用 Docker 或者 kubernetes 的方式安裝服務。我們根據自己的實際需要,進行安裝即可。
# Ubuntu(deb)
$ curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.8.1-amd64.deb
$ sudo dpkg -i filebeat-7.8.1-amd64.deb
$ sudo systemctl enable filebeat
$ sudo service filebeat start
# 使用docker啟動
docker run -d --name=filebeat --user=root \
--volume="./filebeat.docker.yml:/usr/share/filebeat/filebeat.yml:ro" \
--volume="/var/lib/docker/containers:/var/lib/docker/containers:ro" \
--volume="/var/run/docker.sock:/var/run/docker.sock:ro" \
docker.elastic.co/beats/filebeat:7.8.1 filebeat -e -strict.perms=false \
-E output.elasticsearch.hosts=["elasticsearch:9200"]
使用Graylog來收集日誌
我們這裡主要介紹使用 Docker 容器來部署服務,如果你需要使用其他方式來部署的話,請自行查看官方文檔對應章節的安裝部署步驟。在服務部署之前,我們需要給 Graylog 服務生成等相關信息,生成部署如下所示:
# 生成password_secret密碼(最少16位)
$ sudo apt install -y pwgen
$ pwgen -N 1 -s 16
zscMb65...FxR9ag
# 生成後續Web登錄時所需要使用的密碼
$ echo -n "Enter Password: " && head -1 </dev/stdin | tr -d '\n' | sha256sum | cut -d" " -f1
Enter Password: zscMb65...FxR9ag
77e29e0f...557515f
生成所需密碼信息之後,我們將如下 yml 信息保存到 docker-comopse.yml 文件中,使用 docker-compose 命令啟動該服務,即可完成部署。之後,通過瀏覽器訪問對應伺服器地址的 9000 埠,即可登錄主頁 。
version: "3"
services:
mongo:
restart: on-failure
container_name: graylog_mongo
image: "mongo:3"
volumes:
- "./mongodb:/data/db"
networks:
- graylog_network
elasticsearch:
restart: on-failure
container_name: graylog_es
image: "elasticsearch:6.8.5"
volumes:
- "./es_data:/usr/share/elasticsearch/data"
environment:
- http.host=0.0.0.0
- transport.host=localhost
- network.host=0.0.0.0
- "ES_JAVA_OPTS=-Xms512m -Xmx5120m"
ulimits:
memlock:
soft: -1
hard: -1
deploy:
resources:
limits:
memory: 12g
networks:
- graylog_network
graylog:
restart: on-failure
container_name: graylog_web
image: "graylog/graylog:3.3"
ports:
- 9000:9000 # Web服務提供的訪問埠
- 5044:5044 # Filebeat工具提供埠
- 12201:12201 # GELF TCP
- 12201:12201/udp # GELF UDP
- 1514:1514 # Syslog TCP
- 1514:1514/udp # Syslog UDP
volumes:
- "./graylog_journal:/usr/share/graylog/data/journal"
environment:
- GRAYLOG_PASSWORD_SECRET=zscMb65...FxR9ag
- GRAYLOG_ROOT_PASSWORD_SHA2=77e29e0f...557515f
- GRAYLOG_HTTP_EXTERNAL_URI=http://11.22.33.44:9000/
- GRAYLOG_TIMEZONE=Asia/Shanghai
- GRAYLOG_ROOT_TIMEZONE=Asia/Shanghai
networks:
- graylog
depends_on:
- mongo
- elasticsearch
networks:
graylog_network:
driver: bridge
需要注意的是,GELF(Graylog Extended Log Format) 的 input 模式可以接受結構化的事件,支持壓縮和分塊。恰好,Docker 服務的 log-driver 驅動原生提供了 GELF 的支持。只需要我們在 Graylog 的 system/inputs 下面創建對應的 input 之後,啟動容器時候指定 log-driver,就可以將容器內的輸出都會發送到 Graylog 裡面了。
使用Graylog來收集日誌
# [docker] 啟動容器指定地址和driver
docker run --rm=true \
--log-driver=gelf \
--log-opt gelf-address=udp://11.22.33.44:12201 \
--log-opt tag=myapp \
myapp:0.0.1
# [docker-compose] 啟動使用方式
version: "3"
services:
redis:
restart: always
image: redis
container_name: "redis"
logging:
driver: gelf
options:
gelf-address: udp://11.22.33.44:12201
tag: "redis"
.
主要介紹 Graylog 界面的相關功能和對應特點!
版權申明:內容來源網絡,版權歸原創者所有。除非無法確認,我們都會標明作者及出處,如有侵權煩請告知,我們會立即刪除並表示歉意。謝謝!