久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

Docker日志收集最佳實(shí)踐

 昵稱22473147 2017-05-12

Docker日志收集最佳實(shí)踐

2017-04-28 日志幫
日志幫

rizhibang

日志管理工具愛好者交流平臺(tái),分享日志管理相關(guān)知識(shí),,普及日志管理理念,。發(fā)布日志管理領(lǐng)域的技術(shù)趨勢(shì),評(píng)測(cè)分享日志管理領(lǐng)域的開源及商業(yè)化產(chǎn)品,。

【寫前面】

關(guān)于日志幫

日志管理工具愛好者交流平臺(tái),,分享日志管理相關(guān)知識(shí),普及日志管理理念,。發(fā)布日志管理領(lǐng)域的技術(shù)趨勢(shì),,評(píng)測(cè)分享日志管理領(lǐng)域的開源及商業(yè)化產(chǎn)品。

我們將持續(xù)分享更多日志相關(guān)文章,,記得關(guān)注我們,。


以下是精彩內(nèi)容整理:

傳統(tǒng)日志處理

說到日志,我們以前處理日志的方式如下:

· 日志寫到本機(jī)磁盤上,;

· 通常僅用于排查線上問題,,很少用于數(shù)據(jù)分析;

·需要時(shí)登錄到機(jī)器上,,用grep,、awk等工具分析。


那么,,這種方式有什么缺點(diǎn)呢?


第一,,   它的效率非常低,,因?yàn)槊恳淮我挪閱栴}的時(shí)候都要登到機(jī)器上去,當(dāng)有幾十臺(tái)或者是上百臺(tái)機(jī)器的時(shí)候,,每一臺(tái)機(jī)器去登陸這是一個(gè)沒辦法接受的事情,,可能一臺(tái)機(jī)器浪費(fèi)兩分鐘,,整個(gè)幾小時(shí)就過去了。


第二,,   如果要進(jìn)行一些比較復(fù)雜的分析,,像grep、awk兩個(gè)簡(jiǎn)單的命令不能夠滿足需求時(shí),,就需要運(yùn)行一些比較復(fù)雜的程序進(jìn)行分析,。


第三,   日志本身它的價(jià)值不光在于排查一些系統(tǒng)問題上面,,可能在一些數(shù)據(jù)的分析上,,可能利用日志來做一些用戶的決策,這也是它的價(jià)值,,如果不能把它利用起來,,價(jià)值就不能充分的發(fā)揮出來。



所以,,現(xiàn)在很多公司會(huì)采用集中式日志收集的日志處理方式,,我們會(huì)把日志分布式收集,集中來存儲(chǔ),,我們會(huì)在所有機(jī)器上面把日志都收集起到一個(gè)中心,,在中心里面做一個(gè)日志全文索引搜索,可以通過一個(gè)界面去查詢,,同時(shí)這個(gè)日志系統(tǒng)后端可以對(duì)接一些更復(fù)雜的數(shù)據(jù)處理系統(tǒng),,可以對(duì)接監(jiān)控、報(bào)警系統(tǒng),,對(duì)接數(shù)據(jù)挖掘數(shù)據(jù)分析系統(tǒng),,充分發(fā)揮日志的價(jià)值。


Docker的日志處理




使用過Docker的人尤其是使用過容器編排系統(tǒng),,比如說我們的容器服務(wù),,可能已經(jīng)注意到這樣的一些特點(diǎn):


容器編排跟傳統(tǒng)的布置方式是不一樣的,在容器編排里面,,資源分配應(yīng)用跑到哪臺(tái)機(jī)器上面的決策是由容器層來做的,,所以你事先不知道你的容器應(yīng)用會(huì)跑到哪臺(tái)機(jī)器上面;還有自動(dòng)伸縮,,根據(jù)負(fù)載自動(dòng)增加或者減少容器數(shù)量,;另外,在整個(gè)運(yùn)行過程中,,系統(tǒng)發(fā)生一些情況時(shí),,比如說你的容器宕掉了,容器服務(wù)會(huì)自動(dòng)把容器應(yīng)用遷到其他的機(jī)器上去,,整個(gè)過程非常動(dòng)態(tài),,如果像傳統(tǒng)方式去配制日志的收集工具,,從一臺(tái)機(jī)器上面收集某一個(gè)應(yīng)用,在這個(gè)動(dòng)態(tài)下面,,很難用原來的方式去配置,。


基于這些特點(diǎn),在Docker的日志里面,, 我們只能夠采用中心化的日志收集方案,,你已經(jīng)沒辦法再像原來登到一臺(tái)機(jī)器上面去看它的日志是什么,因?yàn)槟悴恢浪鋵?shí)在哪個(gè)機(jī)器上面,。


stdout和文件日志


Docker的日志我們可以把它分成兩類,,一類是stdout標(biāo)準(zhǔn)輸出,另外一類是文件日志,。stdout是寫在標(biāo)準(zhǔn)輸出里面的日志,,比如你在程序里面,通過print或者echo來輸出的時(shí)候,,這種輸出標(biāo)準(zhǔn)在linux上面其實(shí)是往一個(gè)ID為零的文件表述書里面去寫,;另外的就是文件日志,文件日志就是寫在磁盤上的日志,,一般來說我們會(huì)在傳統(tǒng)的應(yīng)用里面會(huì)用得多一些,。


stdout


在Docker的場(chǎng)景里面,目前比較推崇這種標(biāo)準(zhǔn)輸出的日志,,標(biāo)準(zhǔn)輸出日志具體過程如圖,。標(biāo)準(zhǔn)輸出日志的原理在于,當(dāng)在啟動(dòng)進(jìn)程的時(shí)候,,進(jìn)程之間有一個(gè)父子關(guān)系,,父進(jìn)程可以拿到子進(jìn)程的標(biāo)準(zhǔn)輸出。拿到子進(jìn)程標(biāo)準(zhǔn)輸出的后,,父進(jìn)程可以對(duì)標(biāo)準(zhǔn)輸出做所有希望的處理。



例如,,我們通過exec.Command啟動(dòng)了一個(gè)命令,,帶一些參數(shù),然后就可以通過標(biāo)準(zhǔn)的pipeline拿到標(biāo)準(zhǔn)輸出,,后面就可以拿到程序運(yùn)行過程中產(chǎn)生標(biāo)準(zhǔn)輸出,。 Docker也是用這個(gè)原理來拿的,所有的容器通過Docker Daemon啟動(dòng),,實(shí)際上屬于Docker的一個(gè)子進(jìn)程,, 它可以拿到你的容器里面進(jìn)程的標(biāo)準(zhǔn)輸出,然后拿到標(biāo)準(zhǔn)輸出之后,會(huì)通過它自身的一個(gè)叫做LogDriver的模塊來處理,,LogDriver就是Docker用來處理容器標(biāo)準(zhǔn)輸出的一個(gè)模塊。 Docker支持很多種不同的處理方式,,比如你的標(biāo)準(zhǔn)輸出之后,,在某一種情況下會(huì)把它寫到一個(gè)日志里面,Docker默認(rèn)的JSON File日志,,除此之外,,Docker還可以把它發(fā)送到syslog里面,,或者是發(fā)送到j(luò)ournald里面去,或者是gelf的一個(gè)系統(tǒng),。


怎么配置log driver呢?


用Docker來啟動(dòng)容器的話,,你有兩種方式來配置LogDriver:



第一種方式是在Daemon上配置,,對(duì)所有的容器生效。你配置之后,,所有的容器啟動(dòng),,如果沒有額外的其他配制,默認(rèn)情況下就會(huì)把所有容器標(biāo)準(zhǔn)輸出全部都發(fā)送給Syslog服務(wù),,這樣就可以在這個(gè)Syslog服務(wù)上面收集這臺(tái)機(jī)器上的所有容器的標(biāo)準(zhǔn)輸出,;


第二種方式是在容器上配置,只對(duì)當(dāng)前容器生效,。如果你希望這個(gè)配置只對(duì)一個(gè)容器生效,不希望所有容器都受到影響,,你可以在容器上面配置,。啟動(dòng)一個(gè)容器,單獨(dú)配置它自身使用的logdriver,。



其實(shí)Docker之前已經(jīng)支持了很多的logdriver,,圖中列表是直接從Docker的官方文檔上面拿到的。


文件日志


對(duì)于stdout的這種日志,,在Docker里面現(xiàn)在處理起來還是比較方便的,,如果沒有現(xiàn)成Logdriver的也可以自己實(shí)現(xiàn)一個(gè),但是對(duì)于文件日志處理起來就沒有這么簡(jiǎn)單了。如果在一個(gè)容器里面寫了日志,,文件位于容器內(nèi)部,,從宿主機(jī)上無法訪問,的確你是可以根據(jù)Docker用的devicemapper,、overlayfs訪問到它里面的一個(gè)文件,,但是這種方式跟Docker的實(shí)現(xiàn)機(jī)制是有關(guān)系的,將來它如果改變,,你的方案就失效了,;另外,容器運(yùn)行非常動(dòng)態(tài),,日志收集程序難以配置,,如果有一個(gè)日志收集的程序,在機(jī)器上面配置要收集哪個(gè)文件,,它的格式是什么樣子的,、發(fā)送到哪兒?因?yàn)橐慌_(tái)機(jī)器上面容器是一直在動(dòng)態(tài)變的,,它隨時(shí)可能在增加一個(gè)或者刪除一個(gè),,事先你并不知道這臺(tái)機(jī)器上會(huì)跑了多少個(gè)容器,他們的配置是怎么樣子的,,他們的日志是寫在哪兒的,,所以沒辦法預(yù)先在一臺(tái)機(jī)器上面把這個(gè)采集程序配好,這就是文件收集比較難的兩個(gè)地方,。


最簡(jiǎn)單的一個(gè)方案,,給每個(gè)容器弄一個(gè)日志采集進(jìn)程,這個(gè)進(jìn)程跑到容器里面,,就可以解決以上的兩個(gè)問題,,第一因?yàn)樗艿饺萜骼锩妫涂梢栽L問到容器里面所有的文件,,包括日志文件,;第二它跟容器在一起,當(dāng)容器啟動(dòng)的時(shí)候,,收集日志的進(jìn)程也啟動(dòng)了,,當(dāng)容器銷毀的時(shí)候,進(jìn)程也就被銷毀掉了,。


這個(gè)方案非常簡(jiǎn)單,,但是其實(shí)會(huì)有很多的缺點(diǎn):


第一,   因?yàn)槊總€(gè)容器都有一個(gè)日志的進(jìn)程,,意味著你的機(jī)器上面有100個(gè)容器,,就需要啟動(dòng)一百個(gè)日志設(shè)備的程序,資源的浪費(fèi)非常厲害。


第二,,   在做鏡像的時(shí)候,,需要把容器里面日志采集程序做到鏡像里面去,對(duì)你的鏡像其實(shí)是有入侵的,,為了日志采集,,不得不把自己的日志程序再做個(gè)新鏡像,然后把東西放進(jìn)去,,所以對(duì)你的鏡像過程是有入侵性的。


第三,,   當(dāng)一個(gè)容器里面好多個(gè)進(jìn)程的時(shí)候,,對(duì)于容器的資源管理,會(huì)干擾你對(duì)容器的資源使用的判斷,,包括對(duì)于在做資源分配和監(jiān)控的時(shí)候,,都會(huì)有一些這樣的干擾。


fluentd-pilot


在容器服務(wù)上面,,我們新開發(fā)了一個(gè)工具,,稱之為fluentd-pilot。


fluentd-pilot是一個(gè)開源的日志采集工具,,適合直接在一臺(tái)機(jī)器上面跑單個(gè)進(jìn)程模式,。fluentd-pilot有這樣的一些特點(diǎn):


· 一個(gè)單獨(dú)fluentd進(jìn)程,收集機(jī)器上所有容器的日志,。不需要為每個(gè)容器啟動(dòng)一個(gè)fluentd進(jìn)程,;


· 聲明式配置。使用label聲明要收集的日志文件的路徑,;


· 支持文件和stdout,;


· 支持多種后端存儲(chǔ):elasticsearch, 阿里云日志服務(wù), graylog2…



具體是怎么做呢?如圖,,這是一個(gè)簡(jiǎn)單的結(jié)構(gòu),,在Docker宿主機(jī)上面部署一個(gè)fluentd-pilot容器,然后在容器里面啟動(dòng)的時(shí)候,,我們要聲明容器的日志信息,,fluentd-pilot會(huì)自動(dòng)感知所有容器的配置。每次啟動(dòng)容器或者刪除容器的時(shí)候,,它能夠看得到,,當(dāng)看到容器有新容器產(chǎn)生之后,它就會(huì)自動(dòng)給新容器按照你的配置生成對(duì)應(yīng)的配置文件,,然后去采集,,最后采集回來的日志同樣也會(huì)根據(jù)配置發(fā)送到后端存儲(chǔ)里面去,這里面后端主要指的elasticsearch或者是SLS這樣的系統(tǒng),接下來你可以在這個(gè)系統(tǒng)上面用一些工具來查詢等等,。整個(gè)這一塊在Docker宿主機(jī)上面,,外面的就是外部系統(tǒng),由這兩個(gè)部分來組成,。


我們既然要用fluentd-pilot,,就得先把它啟動(dòng)起來。還要有一個(gè)日志系統(tǒng),,日志要集中收集,,必然要有一個(gè)中間服務(wù)去收集和存儲(chǔ),所以要先把這種東西準(zhǔn)備好,,然后我們?cè)诿恳粋€(gè)收集日志的機(jī)器上面部署一個(gè)fluentd-pilot,,用這個(gè)命令來部署,其實(shí)現(xiàn)在它是一個(gè)標(biāo)準(zhǔn)的Docker鏡像,,內(nèi)部支持一些后端存儲(chǔ),,可以通過環(huán)境變量來指定日志放到哪兒去,這樣的配置方式會(huì)把所有的收集到的日志全部都發(fā)送到elasticsearch里面去,,當(dāng)然兩個(gè)管掛載是需要的,,因?yàn)樗B接Docker,要感知到Docker里面所有容器的變化,,它要通過這種方式來訪問宿主機(jī)的一些信息,。


配置好之后啟動(dòng)應(yīng)用,我們看應(yīng)用上面要收集的日志,,我該在上面做什么樣的聲明,?關(guān)鍵的配置有兩個(gè),一是label catalina,,聲明的時(shí)候要收集容器的日志,,所有的名字都可以;二是聲明access,,這也是個(gè)名字,,都可以用你喜歡的名字。這樣一個(gè)路徑的地址,,當(dāng)你通過這樣的配置來去啟動(dòng)fluentd-pilot容器之后,,它就能夠感覺到這樣一個(gè)容器的啟動(dòng)事件,它會(huì)去看容器的配置是什么,,要收集這個(gè)目錄下面的文件日志,,然后告訴fluentd-pilot去中心配置并且去采集,這里有一個(gè)-V,,實(shí)際上跟Logs是一致的,,在容器外面實(shí)際上沒有一種通用的方式能夠獲取到容器里面的文件,,所有我們主動(dòng)把目錄從宿主機(jī)上掛載進(jìn)來,這樣就可以在宿主機(jī)上看到目錄下面所有的東西,。


除了最簡(jiǎn)單的場(chǎng)景之外,,你的日志可能會(huì)有一些更復(fù)雜的特性,比如你的日志格式是什么樣子,,你可能希望在收集之后加一些內(nèi)容,,便于搜索,當(dāng)你在真用的時(shí)候,,它不光是一個(gè)非常簡(jiǎn)單的容器,,它可能屬于某一個(gè)業(yè)務(wù)或者屬于某一個(gè)應(yīng)用,那么,,你希望在收集的時(shí)候能夠有一些關(guān)聯(lián)信息,,所以你可以指定日志格式是什么樣子,然后可以在日志里添加tag,,這些tag相當(dāng)于一些關(guān)鍵信息,可以附加任何需要的關(guān)聯(lián)信息,,這樣將來在搜索的時(shí)候可以更方便的把這些日志聚在一塊,;而且,它可以指定很多的后端,,fluetnd-pilot支持多種后端,,使用環(huán)境變量FLUENTD_OUTPUT指定后端類型。


fluent-pilot已經(jīng)開源,,如果功能不滿足需求,,可以自己定制,自己修改代碼實(shí)現(xiàn)需要的功能,。它的結(jié)構(gòu)比較簡(jiǎn)單,,有這樣幾個(gè)模塊:


最上層是容器事件管理,這一塊跟Docker進(jìn)行交互,,它會(huì)感知Docker的創(chuàng)建容器,,然后做出相應(yīng)的生成配置或者清理配置上的事情;解析容器label跟容器配置,,當(dāng)你創(chuàng)建一個(gè)新容器之后,,就會(huì)用這個(gè)模塊拿到新容器的配置,然后生成對(duì)應(yīng)的配置文件,;FluentdController主要是用來維護(hù)對(duì)應(yīng)進(jìn)程,,包括控制什么時(shí)候加載新配置,然后檢測(cè)一些健康狀態(tài)等等,;再下面就是Fluentd的一些插件,,如果你需要增加一些日志的后端,,就可以自己實(shí)現(xiàn)一些插件,放在這個(gè)里面,,然后再生成跟對(duì)應(yīng)的插件相關(guān)的一些配置,。   


fleuntd-pilot+阿里云容器服務(wù)


以上是fleuntd-pilot本身的一些能力,現(xiàn)在你可以在任何地方使用它,,但是在容器服務(wù)上面我們針對(duì)它做了一些更加靈活方便,、更酷的一些事情,容器服務(wù)為fluentd-pilot進(jìn)行優(yōu)化:

第一,,   自動(dòng)識(shí)別aliyun.logs標(biāo)簽,,并創(chuàng)建Volume;

第二,,   重新部署,,新容器自動(dòng)復(fù)用已有的Volume,避免日志丟失,。


原生支持SLS


容器服務(wù)有一個(gè)很棒的特點(diǎn),,它會(huì)跟其他的云產(chǎn)品做一些非常方便的集成,這對(duì)于用戶來說,,在使用容器服務(wù)的時(shí)候,,云產(chǎn)品能夠更加方便的使用。比如說在日志方面,,阿里云容器服務(wù)專為SLS做了優(yōu)化,,讓用戶更簡(jiǎn)單的在容器服務(wù)上使用SLS。SLS是阿里云提供的日志服務(wù),,性能強(qiáng)悍,,使用方便,還可以對(duì)接ODPS等數(shù)據(jù)系統(tǒng),;支撐1W臺(tái)物理機(jī),,一天12TB日志數(shù)據(jù),IOPS>= 2W,,采集平均<1 s;單機(jī):在1個(gè)cpu="" core情況下,,可以實(shí)時(shí)采集15-18mb/s="">


優(yōu)化優(yōu)點(diǎn)具體體現(xiàn)在:自動(dòng)創(chuàng)建sls的project, logstore;同時(shí)支持stdout和文件日志,,使用同樣的方式配置,。


容器服務(wù)日志方案


比如在容器服務(wù)上面布一個(gè)tomcat,可能會(huì)寫如圖的一個(gè)標(biāo)準(zhǔn)Docker的模板,。  


當(dāng)你通過部署之后,,就可以在日志服務(wù)上面看到會(huì)生成兩個(gè)東西,都是創(chuàng)建好的,,加一些前綴來區(qū)分,,不用管一些配置,,你唯一要做的事是什么呢?點(diǎn)日志索引查詢,,然后到日志搜索界面,,剛才啟動(dòng)的時(shí)候一些日志,可以看到從哪過來的,,這條日志的內(nèi)容是什么,,這些信息都已經(jīng)很快的出現(xiàn)了,包括需要檢索可以選中一個(gè)時(shí)間段,,輸入關(guān)健詞去做一些搜索,,自動(dòng)在日志服務(wù)上創(chuàng)建并配置logstore。


我們?cè)谌萜鞣?wù)上面做到了對(duì)于文件日志的收集,,并且方式也都非常簡(jiǎn)單,,都是你可以設(shè)立一個(gè)label,通過label方式可以收集到所有的日志,。


日志存儲(chǔ)方案


最后簡(jiǎn)單的介紹幾種日志存儲(chǔ)方案的對(duì)比,,圖為現(xiàn)在比較流行的日志方案Elasticsearch,它本身并不提供界面,,ELK中的E,,基于Lucene,主要用于日志索引,、存儲(chǔ)和分析,;通常配合Kibana展示日志,,免費(fèi),,支持集群模式,可以搭一個(gè)Docker用的生產(chǎn)環(huán)境可用的系統(tǒng),。

接下來是graylog2,,目前不算很流行,但是也是功能很強(qiáng)大的系統(tǒng),,它不像Elasticsearch還需要配合其它去使用,,它自身擁有日志存儲(chǔ)、索引以及展示所有的功能,,都在一個(gè)系統(tǒng)里面實(shí)現(xiàn),,它可以設(shè)置一些報(bào)警規(guī)則,當(dāng)日志里面出現(xiàn)一些關(guān)鍵字的時(shí)候自動(dòng)報(bào)警,,這個(gè)功能還是非常有用的,,免費(fèi)、支持集群模式,,可以在生產(chǎn)環(huán)境里面搭一個(gè)Docker用的生產(chǎn)系統(tǒng),。


用正確的方式寫日志


那么,,我們?cè)趺礃尤ナ占罩尽⒋鎯?chǔ)日志,,用什么樣的系統(tǒng),,日志的源頭和寫日志我們又該怎么來做,有這樣幾個(gè)建議:


1.  選擇合適的日志框架,,不要直接print,;

2.  為每一條日志選擇正確的level,該debug的不要用info,;

3.  附加更多的上下文信息,;

4.  使用json、csv等日志格式,,方便工具解析,;

5.  盡量不要使用多行日志(Java Exception Stack)。





日志幫

日志管理工具愛好者交流平臺(tái)

閱讀

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多