Filebeat是本地文件的日志數(shù)據(jù)采集器,可監(jiān)控日志目錄或特定日志文件(tail file),并將它們轉(zhuǎn)發(fā)給Elasticsearch或Logstatsh進(jìn)行索引、kafka等。帶有內(nèi)部模塊(auditd,Apache,Nginx,System和MySQL),可通過一個(gè)指定命令來簡(jiǎn)化通用日志格式的收集,解析和可視化。
成都網(wǎng)站建設(shè)、做網(wǎng)站,成都做網(wǎng)站公司-創(chuàng)新互聯(lián)已向成百上千企業(yè)提供了,網(wǎng)站設(shè)計(jì),網(wǎng)站制作,網(wǎng)絡(luò)營銷等服務(wù)!設(shè)計(jì)與技術(shù)結(jié)合,多年網(wǎng)站推廣經(jīng)驗(yàn),合理的價(jià)格為您打造企業(yè)品質(zhì)網(wǎng)站。
官方網(wǎng)址:
Filebeat涉及兩個(gè)組件:查找器prospector和采集器harvester,來讀取文件(tail file)并將事件數(shù)據(jù)發(fā)送到指定的輸出。
啟動(dòng)Filebeat時(shí),它會(huì)啟動(dòng)一個(gè)或多個(gè)查找器,查看你為日志文件指定的本地路徑。對(duì)于prospector所在的每個(gè)日志文件,prospector啟動(dòng)harvester。每個(gè)harvester都會(huì)為新內(nèi)容讀取單個(gè)日志文件,并將新日志數(shù)據(jù)發(fā)送到libbeat,后者將聚合事件并將聚合數(shù)據(jù)發(fā)送到你為Filebeat配置的輸出。
當(dāng)發(fā)送數(shù)據(jù)到Logstash或Elasticsearch時(shí),F(xiàn)ilebeat使用一個(gè)反壓力敏感(backpressure-sensitive)的協(xié)議來解釋高負(fù)荷的數(shù)據(jù)量。當(dāng)Logstash數(shù)據(jù)處理繁忙時(shí),F(xiàn)ilebeat放慢它的讀取速度。一旦壓力解除,F(xiàn)ilebeat將恢復(fù)到原來的速度,繼續(xù)傳輸數(shù)據(jù)。
Harvester負(fù)責(zé)讀取單個(gè)文件的內(nèi)容。讀取每個(gè)文件,并將內(nèi)容發(fā)送到the output,每個(gè)文件啟動(dòng)一個(gè)harvester, harvester負(fù)責(zé)打開和關(guān)閉文件,這意味著在運(yùn)行時(shí)文件描述符保持打開狀態(tài)。
如果文件在讀取時(shí)被刪除或重命名,F(xiàn)ilebeat將繼續(xù)讀取文件。這有副作用,即在harvester關(guān)閉之前,磁盤上的空間被保留。默認(rèn)情況下,F(xiàn)ilebeat將文件保持打開狀態(tài),直到達(dá)到close_inactive狀態(tài)
關(guān)閉harvester會(huì)產(chǎn)生以下結(jié)果:
1)如果在harvester仍在讀取文件時(shí)文件被刪除,則關(guān)閉文件句柄,釋放底層資源。
2)文件的采集只會(huì)在scan_frequency過后重新開始。
3)如果在harvester關(guān)閉的情況下移動(dòng)或移除文件,則不會(huì)繼續(xù)處理文件。
要控制收割機(jī)何時(shí)關(guān)閉,請(qǐng)使用close_ *配置選項(xiàng)
Prospector負(fù)責(zé)管理harvester并找到所有要讀取的文件來源。如果輸入類型為日志,則查找器將查找路徑匹配的所有文件,并為每個(gè)文件啟動(dòng)一個(gè)harvester。每個(gè)prospector都在自己的Go協(xié)程中運(yùn)行。
Filebeat目前支持兩種prospector類型:log和stdin。每個(gè)prospector類型可以定義多次。日志prospector檢查每個(gè)文件來查看harvester是否需要啟動(dòng),是否已經(jīng)運(yùn)行,或者該文件是否可以被忽略(請(qǐng)參閱ignore_older)。
只有在harvester關(guān)閉后文件的大小發(fā)生了變化,才會(huì)讀取到新行。
注:Filebeat prospector只能讀取本地文件,沒有功能可以連接到遠(yuǎn)程主機(jī)來讀取存儲(chǔ)的文件或日志。
配置文件:$FILEBEAT_HOME/filebeat.yml。Filebeat可以一次讀取某個(gè)文件夾下的所有后綴名為log的文件,也可以讀取指定的某一個(gè)后綴名為log的文件。
配置文件詳解( )
(1)字段解釋
paths: 指定要監(jiān)控的日志,目前按照Go語言的glob函數(shù)處理。沒有對(duì)配置目錄做遞歸處理,比如配置的如果是:
/var/log/* /*.log
則只會(huì)去/var/log目錄的所有子目錄中尋找以".log"結(jié)尾的文件,而不會(huì)尋找/var/log目錄下以".log"結(jié)尾的文件。
encoding: 指定被監(jiān)控的文件的編碼類型,使用plain和utf-8都是可以處理中文日志的。
input_type: 指定文件的輸入類型log(默認(rèn))或者stdin。
exclude_lines: 在輸入中排除符合正則表達(dá)式列表的那些行。
include_lines: 包含輸入中符合正則表達(dá)式列表的那些行(默認(rèn)包含所有行),include_lines執(zhí)行完畢之后會(huì)執(zhí)行exclude_lines。
exclude_files: 忽略掉符合正則表達(dá)式列表的文件(默認(rèn)為每一個(gè)符合paths定義的文件都創(chuàng)建一個(gè)harvester)。
fields: 向輸出的每一條日志添加額外的信息,比如"level:debug",方便后續(xù)對(duì)日志進(jìn)行分組統(tǒng)計(jì)。默認(rèn)情況下,會(huì)在輸出信息的fields子目錄下以指定的新增fields建立子目錄,
fields_under_root: 如果該選項(xiàng)設(shè)置為true,則新增fields成為頂級(jí)目錄,而不是將其放在fields目錄下。自定義的field會(huì)覆蓋filebeat默認(rèn)的field。
ignore_older: 可以指定Filebeat忽略指定時(shí)間段以外修改的日志內(nèi)容,比如2h(兩個(gè)小時(shí))或者5m(5分鐘)。
close_older: 如果一個(gè)文件在某個(gè)時(shí)間段內(nèi)沒有發(fā)生過更新,則關(guān)閉監(jiān)控的文件handle。默認(rèn)1h。
force_close_files: Filebeat會(huì)在沒有到達(dá)close_older之前一直保持文件的handle,如果在這個(gè)時(shí)間窗內(nèi)刪除文件會(huì)有問題,所以可以把force_close_files設(shè)置為true,只要filebeat檢測(cè)到文件名字發(fā)生變化,就會(huì)關(guān)掉這個(gè)handle。
scan_frequency: Filebeat以多快的頻率去prospector指定的目錄下面檢測(cè)文件更新(比如是否有新增文件),如果設(shè)置為0s,則Filebeat會(huì)盡可能快地感知更新(占用的CPU會(huì)變高)。默認(rèn)是10s。
document_type: 設(shè)定Elasticsearch輸出時(shí)的document的type字段,也可以用來給日志進(jìn)行分類。
harvester_buffer_size: 每個(gè)harvester監(jiān)控文件時(shí),使用的buffer的大小。
max_bytes: 日志文件中增加一行算一個(gè)日志事件,max_bytes限制在一次日志事件中最多上傳的字節(jié)數(shù),多出的字節(jié)會(huì)被丟棄。默認(rèn)是10MB。
multiline: 適用于日志中每一條日志占據(jù)多行的情況,比如各種語言的報(bào)錯(cuò)信息調(diào)用棧。這個(gè)配置的下面包含如下配置:
pattern: 多行日志開始的那一行匹配的pattern
negate: 是否需要對(duì)pattern條件轉(zhuǎn)置使用,不翻轉(zhuǎn)設(shè)為true,反轉(zhuǎn)設(shè)置為false。
match: 匹配pattern后,與前面(before)還是后面(after)的內(nèi)容合并為一條日志
max_lines: 合并的最多行數(shù)(包含匹配pattern的那一行),默認(rèn)為500行。
timeout: 到了timeout之后,即使沒有匹配一個(gè)新的pattern(發(fā)生一個(gè)新的事件),也把已經(jīng)匹配的日志事件發(fā)送出去
tail_files: 如果設(shè)置為true,F(xiàn)ilebeat從文件尾開始監(jiān)控文件新增內(nèi)容,把新增的每一行文件作為一個(gè)事件依次發(fā)送,而不是從文件開始處重新發(fā)送所有內(nèi)容。
backoff: Filebeat檢測(cè)到某個(gè)文件到了EOF之后,每次等待多久再去檢測(cè)文件是否有更新,默認(rèn)為1s。
max_backoff: Filebeat檢測(cè)到某個(gè)文件到了EOF之后,等待檢測(cè)文件更新的最大時(shí)間,默認(rèn)是10秒。
backoff_factor: 定義到達(dá)max_backoff的速度,默認(rèn)因子是2,到達(dá)max_backoff后,變成每次等待max_backoff那么長的時(shí)間才backoff一次,直到文件有更新才會(huì)重置為backoff。比如:?
如果設(shè)置成1,意味著去使能了退避算法,每隔backoff那么長的時(shí)間退避一次。
spool_size: spooler的大小,spooler中的事件數(shù)量超過這個(gè)閾值的時(shí)候會(huì)清空發(fā)送出去(不論是否到達(dá)超時(shí)時(shí)間),默認(rèn)1MB。
idle_timeout: spooler的超時(shí)時(shí)間,如果到了超時(shí)時(shí)間,spooler也會(huì)清空發(fā)送出去(不論是否到達(dá)容量的閾值),默認(rèn)1s。
registry_file: 記錄filebeat處理日志文件的位置的文件
config_dir: 如果要在本配置文件中引入其他位置的配置文件,可以寫在這里(需要寫完整路徑),但是只處理prospector的部分。
publish_async: 是否采用異步發(fā)送模式(實(shí)驗(yàn)功能)。
具體的一個(gè)yml采集配置樣例如下:該配置文件是filebeat采集數(shù)據(jù)的依據(jù),并根據(jù)需求添加必要配置,filebeat收集日志后發(fā)往logstash,配置如下:
cd FILEBEAT_HOME
nohup ./bin/filebeat -f config/test.conf /FILEBEAT_HOME/logs/filebeat.log
后臺(tái)啟動(dòng)filebeat,配置對(duì)應(yīng)的參數(shù)
啟動(dòng)多個(gè)filebeat配置,新建一個(gè)目錄(conf)存放多個(gè)filebeat的配置文件,
#nohup ./bin/filebeat -f conf/* /FILEBEAT_HOME/logs/filebeat.log
注意:一臺(tái)服務(wù)器只能啟動(dòng)一個(gè)filebeat進(jìn)程。
ps -ef |grep filebeat
kill -9 $pid
注意: 非緊急情況下,殺掉進(jìn)程只能用優(yōu)雅方式。
A、filebeat運(yùn)行不成功
問題:配置文件格式有問題,配置文件遵循yml文件格式, 多或少一個(gè)空格 都會(huì)導(dǎo)致啟動(dòng)問題,可以使用cmd命令窗口到filebeat安裝路徑下,使用filebeat.exe –c filebeat.yml 查看報(bào)錯(cuò),也可以看filebeat路徑下的log文件夾中的filebeat文件
B、 filebeat第一次運(yùn)行成功無數(shù)據(jù)
問題:a、路徑有問題
b、運(yùn)行條件設(shè)置有問題(例如只采集某個(gè)條件下的數(shù)據(jù),文件中沒有符合條件的數(shù)據(jù),這種情況下先注釋掉采集條件測(cè)試一下)
C、filebeat運(yùn)行成功第一次運(yùn)行后有數(shù)據(jù),第二次無數(shù)據(jù)
問題:filebeat讀取文件后會(huì)生成一個(gè)registry文件,注意windows機(jī)器中這個(gè)文件在手動(dòng)啟動(dòng)的情況下會(huì)在filebeat安裝目錄下的data文件夾中,服務(wù)注冊(cè)啟動(dòng)的情況下會(huì)在C盤下隱藏文件夾C:\ProgramData\filebeat中,刪除掉這個(gè)就可以了
D、filebeat運(yùn)行成功有數(shù)據(jù),但是新添加數(shù)據(jù)不讀取問題
問題:filebeat傳輸存在反壓機(jī)制,在數(shù)據(jù)量特別大或者傳輸通道不通的情況下,filebeat會(huì)進(jìn)行反壓,暫停發(fā)送,等到數(shù)據(jù)量穩(wěn)定或者數(shù)據(jù)傳輸通道正常的之后才會(huì)發(fā)送
Filebeat 保存每個(gè)文件的狀態(tài)并經(jīng)常將狀態(tài)刷新到磁盤上的注冊(cè)文件中。該狀態(tài)用于記住harvester正在讀取的最后偏移量,并確保發(fā)送所有日志行。如果輸出(例如Elasticsearch或Logstash)無法訪問,F(xiàn)ilebeat會(huì)跟蹤最后發(fā)送的行,并在輸出再次可用時(shí)繼續(xù)讀取文件。
在Filebeat運(yùn)行時(shí),每個(gè)prospector內(nèi)存中也會(huì)保存文件狀態(tài)信息,當(dāng)重新啟動(dòng)Filebeat時(shí),將使用注冊(cè)文件的數(shù)據(jù)來重建文件狀態(tài),F(xiàn)ilebeat將每個(gè)harvester在從保存的最后偏移量繼續(xù)讀取。
每個(gè)prospector為它找到的每個(gè)文件保留一個(gè)狀態(tài)。由于文件可以被重命名或移動(dòng),因此文件名和路徑不足以識(shí)別文件。對(duì)于每個(gè)文件,F(xiàn)ilebeat存儲(chǔ)唯一標(biāo)識(shí)符以檢測(cè)文件是否先前已被采集過。
如果你使用的案例涉及每天創(chuàng)建大量新文件,你可能會(huì)發(fā)現(xiàn)注冊(cè)文件增長過大。請(qǐng)參閱注冊(cè)表文件太大?編輯有關(guān)你可以設(shè)置以解決此問題的配置選項(xiàng)的詳細(xì)信息。
Filebeat保證事件至少會(huì)被傳送到配置的輸出一次,并且不會(huì)丟失數(shù)據(jù)。 Filebeat能夠?qū)崿F(xiàn)此行為,因?yàn)樗鼘⒚總€(gè)事件的傳遞狀態(tài)存儲(chǔ)在注冊(cè)文件中。
在輸出阻塞或未確認(rèn)所有事件的情況下,F(xiàn)ilebeat將繼續(xù)嘗試發(fā)送事件,直到接收端確認(rèn)已收到。如果Filebeat在發(fā)送事件的過程中關(guān)閉,它不會(huì)等待輸出確認(rèn)所有收到事件。
發(fā)送到輸出但在Filebeat關(guān)閉前未確認(rèn)的任何事件在重新啟動(dòng)Filebeat時(shí)會(huì)再次發(fā)送。這可以確保每個(gè)事件至少發(fā)送一次,但最終會(huì)將重復(fù)事件發(fā)送到輸出。
也可以通過設(shè)置shutdown_timeout選項(xiàng)來配置Filebeat以在關(guān)閉之前等待特定時(shí)間。
注意:Filebeat的至少一次交付保證包括日志輪換和刪除舊文件的限制。如果將日志文件寫入磁盤并且寫入速度超過Filebeat可以處理的速度,或者在輸出不可用時(shí)刪除了文件,則可能會(huì)丟失數(shù)據(jù)。
在Linux上,F(xiàn)ilebeat也可能因inode重用而跳過行。有關(guān)inode重用問題的更多詳細(xì)信息,請(qǐng)參閱filebeat常見問題解答。
Logback日志切割用的是JDK里File#renameTo()方法。如果該方法失敗,就再嘗試使用復(fù)制數(shù)據(jù)的方式切割日志。查找該方法相關(guān)資料得知,只有當(dāng)源文件和目標(biāo)目錄處于同一個(gè)文件系統(tǒng)、同volumn(即windows下的C, D盤)下該方法才會(huì)成功,切不會(huì)為重命名的后的文件分配新的inode值。也就是說,如果程序里一直保存著該文件的描述符,那么當(dāng)程序再寫日志時(shí),就會(huì)向重命名后的文件中寫。那么問題來了,filebeat是會(huì)一直打開并保存文件描述符的,那么它是怎么得知日志被切割這件事的呢?
如果只用當(dāng)前文件描述符一路監(jiān)控到天黑的話,那么當(dāng)logback把日志重命名后,filebeat仍然會(huì)監(jiān)控重命名后的日志,新創(chuàng)建的日志文件就看不到了。實(shí)際上,filebeat是通過close_inactive和scan_frequency兩個(gè)參數(shù)(機(jī)制)來應(yīng)對(duì)這種情況的:
(1)close_inactive
該參數(shù)指定當(dāng)被監(jiān)控的文件多長時(shí)間沒有變化后就關(guān)閉文件句柄(file handle)。官方建議將這個(gè)參數(shù)設(shè)置為一個(gè)比文件最大更新間隔大的值。比如文件最長5s更新一次,那就設(shè)置成1min。默認(rèn)值為5min。
(2)scan_frequency
該參數(shù)指定Filebeat搜索新文件的頻率(時(shí)間間隔)。當(dāng)發(fā)現(xiàn)新的文件被創(chuàng)建時(shí), Filebeat會(huì)為它再啟動(dòng)一個(gè) harvester 進(jìn)行監(jiān)控,默認(rèn)為10s。
綜合以上兩個(gè)機(jī)制,當(dāng)logback完成日志切割后(即重命名),此時(shí)老的harvester仍然在監(jiān)控重命名后的日志文件,但是由于該文件不會(huì)再更新,因此會(huì)在close_inactive時(shí)間后關(guān)閉這個(gè)文件的 harvester。當(dāng)scan_frequency時(shí)間過后,F(xiàn)ilebeat會(huì)發(fā)現(xiàn)目錄中出現(xiàn)了新文件,于是為該文件啟動(dòng) harvester 進(jìn)行監(jiān)控。這樣就保證了切割日志時(shí)也能不丟不重的傳輸數(shù)據(jù)。(不重是通過為每個(gè)日志文件保存offset實(shí)現(xiàn)的)
對(duì)于Go語言的日志來說,如何將log寫到指定的文件里面,下面是一個(gè)例子。
output:
output:
日常開發(fā)當(dāng)中需要將golang的log包打印的日志同時(shí)輸出到控制臺(tái)和文件,應(yīng)該如何解決這個(gè)問題?
log包可以通過SetOutput()方法指定日志輸出的方式(Writer),但是只能指定一個(gè)輸出的方式(Writer)。我們利用io.MultiWriter()將多個(gè)Writer拼成一個(gè)Writer使用的特性,把log.Println()輸出的內(nèi)容分流到控制臺(tái)和文件當(dāng)中。
原文地址
在項(xiàng)目開始之前,先根據(jù)大概業(yè)務(wù)設(shè)計(jì)日志系統(tǒng)。
一個(gè)好的日志系統(tǒng)在項(xiàng)目維護(hù)時(shí)非常重要。
我的日志系統(tǒng)中的內(nèi)容:
時(shí)間戳
日志調(diào)用地點(diǎn):文件+行號(hào)
報(bào)錯(cuò)級(jí)別 致命 錯(cuò)誤 警告 信息 調(diào)試
Summary
關(guān)鍵內(nèi)存Dump
這些信息方便排查故障。
配置文件: