<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          如何在12個小時,搞定日志監(jiān)控?

          共 4493字,需瀏覽 9分鐘

           ·

          2020-12-01 14:16

          日志監(jiān)控,是每個公司必須解決的一個問題。創(chuàng)業(yè)型公司,如何用半天的時間,搞定一個可擴(kuò)展,通用日志監(jiān)控框架,是今天要聊的話題。
          ?
          什么是日志監(jiān)控?
          關(guān)于日志,不同公司,情況不同:
          (1)A類公司:沒有日志;
          (2)B類公司:有日志,只有用戶說系統(tǒng)掛了,或者有bug的時候,才會登錄到系統(tǒng)看看日志,大部分日志打印得對心所欲,缺乏組織性和系統(tǒng)性;
          畫外音:很多時候,追查bug發(fā)現(xiàn)日志信息不全,要先上線一個有日志的版本,以幫助定位bug。
          (3)C類公司:有日志,有日志規(guī)范,系統(tǒng)性的組織和收集了日志;

          對日志進(jìn)行監(jiān)控,先于用戶發(fā)現(xiàn)系統(tǒng)的故障,實時告警,就是今天要討論的日志監(jiān)控問題。
          ?
          日志監(jiān)控有什么需求?
          對于日志的監(jiān)控,一般有這么幾類需求:
          (1)某種級別的日志(例如FATAL級別,或者ERROR級別的日志)一旦出現(xiàn),或者超過一定頻率,就告警;
          (2)包含某些特殊含義關(guān)鍵字(例如OutOfMemory,或者Exception)的異常日志,一旦出現(xiàn),或者超過一定頻率,就告警;
          (3)包含某些特殊含義關(guān)鍵字(例如Login,或者Click)的正常日志,一旦一定時間周期沒有出現(xiàn),就告警;
          ?
          其中,前兩類需求,屬于異常日志監(jiān)控范疇,出現(xiàn)異常,實施告警。第三類需求,屬于正常日志監(jiān)控范疇,一定的時間沒有出現(xiàn)“正?!?,就默認(rèn)異常,實施告警。
          ?
          為什么不是一出現(xiàn)異常日志就告警呢?
          避免抖動引起的誤報,一般到達(dá)一定頻率才會告警,這屬于告警策略的一部分。
          ?
          為什么說,目錄與日志的規(guī)范化,是通用日志監(jiān)控的前提?
          這是一個線上模塊的目錄示例:
          (1)有源代碼:hello.c
          (2)有可執(zhí)行文件:a.out
          (3)有配置文件:hello.conf
          (4)有備份日志:hello.log.2018012812
          (5)有日志:hello.log
          (6)有臨時文件:tmp
          體會一下,運維同學(xué)看到這樣的線上文件部署,是什么感受?
          畫外音:沒見過源代碼直接部署到線上的?
          ?
          有什么常見的目錄規(guī)范呢?
          目錄規(guī)范化不但對日志監(jiān)控,對自動化運維都極為重要,要是線上目錄都瞎搞,幾乎沒有辦法實現(xiàn)自動化運維。

          常見的目錄規(guī)范有兩類:
          (1)模塊優(yōu)先類目錄規(guī)范
          (2)功能優(yōu)先類目錄規(guī)范;

          什么是模塊優(yōu)先的目錄規(guī)范?
          如上圖,以模塊名為優(yōu)先組織目錄
          (1)根目錄下,有das,entry,logic三個模塊目錄;
          (2)在模塊目錄下,又分別有存放可執(zhí)行文件,配置文件,日志文件的bin目錄,conf目錄,以及l(fā)og目錄;
          ?
          什么是功能優(yōu)先的目錄規(guī)范?
          如上圖,以功能為優(yōu)先組織目錄
          (1)根目錄下,二進(jìn)制目錄bin,配置文件目錄conf,日志目錄log;
          (2)功能目錄下,有das,entry,logic等不同模塊的目錄;
          ?
          樓主旗幟鮮明的推薦第二種,功能優(yōu)先的目錄規(guī)范,對二進(jìn)制備份,配置備份,日志清理都非常方便。
          ?
          有什么常見的日志規(guī)范呢?
          日志規(guī)范化不但對日志監(jiān)控,對大數(shù)據(jù)體系建設(shè)都極為重要,需要考慮規(guī)范:
          (1)日志分級規(guī)范:不同級別的日志理應(yīng)打到不同的文件中,例如FATAL級,ERROR級,WARM級,LOG級,INFO級,DEBUG級:

          fatal.log

          error.log

          info.log

          debug.log


          (2)日志切分規(guī)范:運維應(yīng)該提供自動化的日志切分工具,支持小時級別,或者天級別的日志切分,曾經(jīng)看過一個120G的access日志,從日志中g(shù)rep出某個uid的日志,是極其低效的:

          daojia.log.2018012800

          daojia.log.2018012801

          daojia.log.2018012823


          (3)日志格式規(guī)范:日志格式規(guī)范是一個可展開的話題,此處不展開;
          畫外音:是不是有小伙伴在思考,ca,自己怎么沒有這三類規(guī)范呢?
          ?
          通用可擴(kuò)展日志監(jiān)控框架,有什么思路?
          制訂了目錄規(guī)范,日志規(guī)范之后,要建立日志監(jiān)控框架,實施異常與正常的日志監(jiān)控,就簡單多了,主要有集中式監(jiān)控,分散式監(jiān)控兩類思路。
          ?
          什么是集中式日志監(jiān)控?
          集中式的日志監(jiān)控,最流行的莫過于ELK
          (1)各個機(jī)器節(jié)點上部署logstash,收集日志;
          (2)收集的日志匯總到ES;
          (3)通過Kibana做統(tǒng)一分析和展現(xiàn);
          運維的同學(xué)對這一套集中式日志監(jiān)控系統(tǒng)非常熟悉。
          ?
          什么是分散式日志監(jiān)控?
          ELK有點重,三套系統(tǒng)搭建與運維起來比較麻煩,如果只是為了實現(xiàn)ERROR日志的監(jiān)控,異常關(guān)鍵字監(jiān)控,正常關(guān)鍵字監(jiān)控,有點殺雞用牛刀了。
          ?
          與集中式的日志監(jiān)控相比,分散式的日志監(jiān)控,就顯得輕量級許多,非常適用與早期的創(chuàng)業(yè)型公司,其思路為:
          (1)通過日志監(jiān)控模塊,對不同集群,進(jìn)行ERROR日志閾值設(shè)置,進(jìn)行異常關(guān)鍵字設(shè)置,正常關(guān)鍵字設(shè)置;
          (2)日志監(jiān)控中心模塊,進(jìn)行統(tǒng)一調(diào)度,將配置分發(fā)到不同機(jī)器的agent節(jié)點上;
          (3)agent節(jié)點模塊,并不統(tǒng)一收集日志,而是接收到監(jiān)控中心分發(fā)的log監(jiān)控配置,在各個機(jī)器上實施日志監(jiān)控,如果觸發(fā)日志監(jiān)控策略,立刻發(fā)起告警;
          ?
          與ELK相比,這個日志監(jiān)控框架會簡單的多,而且擴(kuò)展性非常好。
          ?
          如何半天搞定日志監(jiān)控框架?
          整個框架設(shè)計如上,大致分為三個部分:
          (1)被監(jiān)控集群;
          (2)基礎(chǔ)信息與服務(wù);
          ???????? cluster.info.xml:存儲集群信息
          ???????? owner.info.xml:存儲集群責(zé)任人信息
          ???????? mail.service/SM.service:告警基礎(chǔ)服務(wù)
          (3)日志監(jiān)控框架;
          ?
          集群信息與負(fù)責(zé)人信息,與前文描述的一樣。
          集群配置cluster.info.conf

          [daojia_main]

          ip.list : ip1, ip2, ip3

          log.path : /home/work/log/daojia_main/

          owner.list : shenjian, zhangsan

          ?

          [daojia_user]

          ip.list : ip4, ip5, ip6

          log.path : /home/work/log/daojia_user/

          owner.list : shenjian

          ?
          責(zé)任人配置owner.info.conf

          [shenjian]

          email : [email protected]

          phone :15912345678

          ?

          [zhangsan]

          email : [email protected]

          phone :18611220099

          ?
          日志監(jiān)控框架又分為兩個模塊:
          可擴(kuò)展監(jiān)控配置文件log.monitor.conf

          [log.monitor.item]

          cluster.name : daojia_main

          # error日志監(jiān)控,每分鐘超過此閾值就告警

          error.log. threshold : 10

          # 異常關(guān)鍵字監(jiān)控,日志出現(xiàn)這些關(guān)鍵字就告警

          bad.key : exeption | timeout | coredump

          # 正常關(guān)鍵字監(jiān)控,日志每分鐘不出現(xiàn)這些關(guān)鍵字就告警

          good.key : login | user | click

          ?

          [log.monitor.item]

          cluster.name : daojia_user

          error.log.threshold : 10

          ?
          日志監(jiān)控調(diào)度框架,這里需要編碼啦,偽代碼如下:

          Array[log-monitor] A1= Parse(log.monitor.config);

          Array[cluster-info] A2= Parse(cluster.info.config);

          Array[owner-info] A3= Parse(owner.info.config);

          ?

          // 遍歷所有監(jiān)控項

          for(each item in A1){

          ???????? //取出監(jiān)控項的集群名,閾值,異常/正常關(guān)鍵詞

          ???????? clusterName= item.clusterName;

          ???????? threshold= item.threshold;

          ???????? badKey= item.badkey;

          ???????? goodKey= item.goodkey;

          ?

          ???????? //由集群名,獲取集群信息

          ???????? clusterInfo= A2[clusterName];

          ???????? //獲取日志目錄,集群ip列表,集群負(fù)責(zé)人列表

          ???????? logPath= clusterInfo.path;

          ???????? Listips = clusterInfo.ip;

          ???????? Listowners = clusterinfo.owner;

          ????????

          ???????? //集群內(nèi)的每一個ip實例,都需要日志監(jiān)控

          ???????? for(each ip in ips){

          ?????????????????? //登錄到這一臺機(jī)器

          ?????????????????? ssh $ip

          ?????????????????? //跳到相關(guān)的目錄下

          ?????????????????? cd $logPath

          ?????????????????? //查看近一分鐘error日志數(shù)量

          ?????????????????? $count= `grep $time error.log | wc -l`

          ?????????????????? //查看badkey與goodkey

          ?????????????????? $boolBad= `grep $badkey *`

          ?????????????????? $boolGood= `grep $goodkey *`

          ?

          ?????????????????? if($count< threshold &&?

          ????????????????????????$boolBad==NO &&

          ?????????????????????????$boolGood==YES){

          ??????????????????????????? //正常,繼續(xù)監(jiān)控

          ??????????????????????????? continue;

          ? ? ? ? ?? ? ? ? ?}

          ?

          ? ? ? ? ?? ? ? ? ?// 否則,對所有集群負(fù)責(zé)人發(fā)送告警

          ? ? ? ? ?? ? ? ? ?for(each owner in owners){

          ???????? ? ? ? ? ?? ? ? ? ?// 略…

          ? ? ? ? ?? ? ? ? ?}

          ? ? ? ? ?}

          }

          ?
          一個簡單的調(diào)度框架,看明白了嗎?

          架構(gòu)師之路-分享技術(shù)思路


          思路比結(jié)論更重要,希望大家有收獲。


          調(diào)研
          貴司的日志,你的感觸是:
          (1)ca,啥是日志,什么是grep,沒有日志;
          (2)日志不全,查問題的時候再加日志;
          (3)日志全,但查問題的時候才上去grep一把;
          (4)日志成體系,日志有監(jiān)控,不需要grep;
          瀏覽 34
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  精品大香蕉在线视频 | 男人天堂无码视频 | 秋霞国产午夜精品免费视频 | 影音先锋三级 | 乱伦片中文字幕 |