之前阿里的 tailfile 有許多坑,包括對(duì)軟連接支持度不夠,可能會(huì)有意想不到的后果,不保證采集數(shù)據(jù)完整性。比如有某些 情況下(Checkpoint 文件損毀) 重啟采集進(jìn)程后會(huì)重復(fù)讀取歷史已采集數(shù)據(jù)打爆服務(wù)器 Load。所以,要更好地使用 Filebeat,我們需要了解 Filebeat 哪些事兒我搞不定
,哪些事兒我無法承諾
。官方文檔是一個(gè)非常好的參考:Frequently Asked Questions。
無法從網(wǎng)絡(luò) Volumes 讀取 Log
不建議使用 Filebeat 從網(wǎng)絡(luò) Volumes 讀取日志文件。 盡可能在主機(jī)上安裝 Filebeat 并從那里直接發(fā)送日志文件。 從網(wǎng)絡(luò)Volumes 讀取文件(尤其是在Windows上)可能會(huì)產(chǎn)生意外的副作用。 例如,更改的文件標(biāo)識(shí)符可能導(dǎo)致 Filebeat 再次從頭讀取日志文件。
Filebeat 無法采集數(shù)據(jù)
這可能是因?yàn)?Filebeat 配置不正確或無法將事件發(fā)送到 output,解決方案:
- 確保配置文件指定正在收集的文件的正確路徑。 有關(guān)詳細(xì)信息,請(qǐng)參閱 Step 2: Configuring Filebeat。
- 驗(yàn)證文件是否早于
ignore_older
指定的值。ignore_older
默認(rèn)是禁用的,這取決于設(shè)置的值。 我們可以通過為ignore_older
指定不同的值來更改此行為。 - 確保 Filebeat 能夠?qū)⑹录l(fā)送到已配置的 output。 在調(diào)試模式下運(yùn)行 Filebeat 以確定它是否成功發(fā)布事件:
./filebeat -c config.yml -e -d "*"
下面說說 ignore_older
這個(gè)配置:
如果啟用此選項(xiàng),F(xiàn)ilebeat 將忽略在指定時(shí)間跨度之前修改的任何文件。 如果我們將日志文件保留很長時(shí)間,那么配置ignore_older
尤其有用。 例如,如果要啟動(dòng) Filebeat
,但只想發(fā)送最新文件和自上周以來的文件,則可以配置此選項(xiàng)。我們可以使用時(shí)間字符串,如 2h(2小時(shí))和 5m(5分鐘)。 默認(rèn)值為0
,禁用該設(shè)置。 注釋掉配置與將其設(shè)置為0具有相同的效果。
注意:我們必須設(shè)置 ignore_older > close_inactive。
配置項(xiàng) close_inactive
表示在 harvester
讀取某文件最后一行日志之后,持續(xù)時(shí)間內(nèi)某文件沒有再寫入日志,F(xiàn)ilebeat 將關(guān)閉文件句柄,默認(rèn)是 5m。
發(fā)生 Too many open files
Filebeat 會(huì)持續(xù)保持著句柄,以便以便它可以近乎實(shí)時(shí)地讀取新的日志行。如果 Filebeat 正在收集大量文件,則打開的文件數(shù)可能會(huì)成為問題。在大多數(shù)環(huán)境中,活動(dòng)更新的文件數(shù)較少。應(yīng)相應(yīng)設(shè)置 close_inactive
配置選項(xiàng)以關(guān)閉不再活動(dòng)的文件。
還有其他配置選項(xiàng)可以用來關(guān)閉文件處理程序,但是所有這些配置選項(xiàng)都應(yīng)該仔細(xì)使用,因?yàn)樗鼈兛赡苡懈弊饔谩_x項(xiàng)是:
close_renamed
close_removed
close_eof
close_timeout
harvester_limit
close_renamed
和 close_removed
選項(xiàng)在 Windows 上可用于解決與 log rotate 相關(guān)的問題。請(qǐng)參閱 the section called “Open file handlers cause issues with Windows file rotation?。 close_eof
選項(xiàng)在包含大量文件且只有很少 entries 的環(huán)境中很有用。close_timeout
選項(xiàng)在允許數(shù)據(jù)丟失且必須對(duì)文件句柄關(guān)閉非常重視的情況下非常有用。有關(guān)更多詳細(xì)信息,請(qǐng)參閱 Filebeat Prospectors Configuration。
在使用任何配置選項(xiàng)之前,請(qǐng)確保閱讀了這些配置選項(xiàng)的文檔。
Registry file 過大
Filebeat保持每個(gè)文件的狀態(tài),并將狀態(tài)保持在 registry_file 中。 Filebeat 重新啟動(dòng)時(shí),文件狀態(tài)用于繼續(xù)在先前位置讀取文件。 如果每天生成大量的新文件,則 文registry_file 件可能會(huì)增長得太大。 要減小 registry_file 的大小,有兩個(gè)可用的配置選項(xiàng):clean_removed
和 clean_inactive
。
對(duì)于不再 touch 并需要 ignore 的舊文件,建議使用 clean_inactive
。 對(duì)于已經(jīng)從磁盤刪除的舊文件,則使用 clean_removed
選項(xiàng)。
Inode 復(fù)用造成數(shù)據(jù)采集缺失
在 Linux 文件系統(tǒng)上,F(xiàn)ilebeat 使用 inode 和 device 來標(biāo)識(shí)文件。當(dāng)文件從磁盤中刪除時(shí),可以將 inode 分配給一個(gè)新文件。在涉及文件輪換的用例中,如果舊文件被刪除,并且之后立即創(chuàng)建新文件,則新文件可以具有與被移除的文件完全相同的 inode。在這種情況下,F(xiàn)ilebeat 假定新文件與舊文件相同,并嘗試在舊 offset 繼續(xù)讀取,這是不正確的。
默認(rèn)情況下,永遠(yuǎn)不會(huì)從 registry_file 中刪除。要解決 inode 復(fù)用問題,建議使用 clean_ *
選項(xiàng),特別是 clean_inactive
,以刪除非活動(dòng)文件的狀態(tài)。例如,如果文件每 24 小時(shí)輪換一次,并且輪轉(zhuǎn)的文件不再更新,可以將ignore_older
設(shè)置為48小時(shí),將 clean_inactive
設(shè)置為72小時(shí)。
對(duì)于從磁盤中刪除的文件,可以使用 clean_removed
。請(qǐng)注意,每當(dāng)在掃描期間找不到文件時(shí),clean_removed
會(huì)從 registry_file 清除文件狀態(tài)。如果文件稍后再次顯示,則將從頭重新發(fā)送。
Filebeat 使用了過多 CPU
Filebeat 可能被配置為太頻繁地掃描文件。 檢查 filebeat.yml
配置文件中 scan_frequency
的設(shè)置。 將scan_frequency
設(shè)置為小于1秒可能導(dǎo)致 Filebeat 掃描磁盤過于頻繁。
字段在 Kibana 可視化中不可被索引
如果最近執(zhí)行了 loads 或解析自定義結(jié)構(gòu)化日志的操作,則可能需要刷新索引以使字段在 Kibana 中可用。 要刷新索引,請(qǐng)使用刷新API。 例如:
curl -XPOST 'http://localhost:9200/filebeat-2016.08.09/_refresh'
Filebeat 總是不發(fā)送文件的最后一行
Filebeat 使用換行符來檢測(cè)事件的結(jié)束。 如果行被遞增地添加到正在收集的文件,則最后一行之后需要換行符,否則Filebeat 將不會(huì)讀取文件的最后一行。
如何對(duì) Filebeat 限帶寬
如果需要限制帶寬使用,建議在操作系統(tǒng)上配置網(wǎng)絡(luò)堆棧以執(zhí)行帶寬限制。
例如,以下 Linux 命令通過在端口 5044 上對(duì) TCP 連接設(shè)置 50 kbps 的限制來限制 Filebeat 和 Logstash 之間的連接:
tc qdisc add dev $DEV root handle 1: htb
tc class add dev $DEV parent 1:1 classid 1:10 htb rate 50kbps ceil 50kbps
tc filter add dev $DEV parent 1:0 prio 1 protocol ip handle 10 fw flowid 1:10
iptables -A OUTPUT -t mangle -p tcp --dport 5044 -j MARK --set-mark 10
使用OS工具執(zhí)行帶寬限制可以更好地控制策略。 例如,可以使用操作系統(tǒng)工具在白天限制帶寬,但不能在夜間限制。 或者,可以保留帶寬未封頂,但為流量分配低優(yōu)先級(jí)。
常見的 SSL 相關(guān)錯(cuò)誤和解決方案
以下是一些常見的錯(cuò)誤和解決方法:
x509: cannot validate certificate for <IP address> because it doesn’t contain any IP SANs
這是因?yàn)樽C書僅對(duì) Subject filed 中顯示的 hostname 有效。要解決此問題,請(qǐng)嘗試以下解決方案:
- 為主機(jī)名創(chuàng)建一個(gè)DNS條目,將其映射到服務(wù)器的IP。
- 在
/etc/hosts
中為主機(jī)名創(chuàng)建一個(gè)條目。或在 Windows 上添加一個(gè)條目到C:\Windows\System32\drivers\etc\hosts
。 - 重新創(chuàng)建服務(wù)器證書,并為服務(wù)器的IP地址添加 SubjectAltName(SAN)。這使服務(wù)器的證書對(duì)主機(jī)名和IP地址都有效。
getsockopt: no route to host
這不是SSL問題。這是一個(gè)網(wǎng)絡(luò)問題。確保兩個(gè)主機(jī)可以通信。
getsockopt:connection refused
這不是SSL問題。確保 Logstash 正在運(yùn)行,并且沒有防火墻阻止流量。
No connection could be made because the target machine actively refused it
防火墻拒絕連接。檢查防火墻是否阻止客戶端,網(wǎng)絡(luò)或目標(biāo)主機(jī)上的流量。