<p id="m2nkj"><option id="m2nkj"><big id="m2nkj"></big></option></p>
    <strong id="m2nkj"></strong>
    <ruby id="m2nkj"></ruby>

    <var id="m2nkj"></var>
  • Fluentd 日志拆分

    共 6697字,需瀏覽 14分鐘

     ·

    2020-10-26 19:26

    大部分 Kubernetes 應(yīng)用,我們都會(huì)將不同類型的日志記錄到 stdout 中,比如在《Fluentd 簡(jiǎn)明教程》中提到的應(yīng)用日志和訪問日志,這兩者都是非常重要的信息,因?yàn)樗麄兊娜罩靖袷讲灰粯樱晕覀冃枰獙?duì)他們分別進(jìn)行解析,這就需要我們使用到 Fluentd 的一些插件來配合。本文我們將介紹如何將這些日志拆分為并行的日志流,以便可以進(jìn)一步處理它們。

    設(shè)置

    同樣使用前面我們配置的倉(cāng)庫(kù) https://github.com/r1ckr/fluentd-simplified,Clone 后會(huì)得到如下所示的目錄結(jié)構(gòu):

    fluentd/
    ????├──?etc/
    ????│???└──?fluentd.conf
    ????├──?log/
    ????│???└──?kong.log
    ????└──?output/

    其中 output/ 目錄是 fluentd 最后輸出文件的地方,在 log/kong.log 中,里面是一些運(yùn)行 kong 容器的日志,日志格式如下所示:

    {
    ????"log":"2019/07/31?22:19:52?[notice]?1#0:?start?worker?process?32\n",
    ????"stream":"stderr",
    ????"time":"2019-07-31T22:19:52.3754634Z"
    }

    etc/fluentd.conf 就是我們的 fluentd 配置文件,里面包含輸入和輸出配置,首先我們先來運(yùn)行 fluentd 容器。

    #?Input
    <source>
    ??@type?tail
    ??path?"/var/log/*.log"
    ??tag?"ninja.*"
    ??read_from_head?true
    ??<parse>
    ????@type?"json"
    ????time_format?"%Y-%m-%dT%H:%M:%S.%NZ"
    ????time_type?string
    ??parse>
    source>

    #?Filter?(grep)
    <filter?ninja.var.log.kong**?>
    ??@type?grep
    ??<regexp>
    ????key?log
    ????pattern?/HTTP/
    ??regexp>
    filter>

    #?Output
    <match?**>
    ??@type?file
    ??path?/output/example
    ??append?true
    ??<buffer>
    ????timekey?1d
    ????timekey_use_utc?true
    ????timekey_wait?1m
    ??buffer>
    match>

    運(yùn)行 fluentd

    使用下面的命令在項(xiàng)目根目錄下面啟動(dòng)一個(gè) fluentd 的 Docker 容器:

    $?docker?run?-u?root?-ti?--rm?\
    -v?$(pwd)/etc:/fluentd/etc?\
    -v?$(pwd)/log:/var/log/?\
    -v?$(pwd)/output:/output?\
    fluent/fluentd:v1.11-debian-1?-c?/fluentd/etc/fluentd-simplified-finished.conf?-v

    注意上面的運(yùn)行命令和我們要掛載的卷

    • etc/ 是掛載在容器內(nèi)部的 /fluentd/etc/ 目錄下的,以覆蓋 fluentd 的默認(rèn)配置。
    • log/ 掛載到 /var/log/,最后在容器里面掛載到 /var/log/kong.log。
    • output/ 掛載到 /output,以便能夠看到 fluentd 寫入磁盤的內(nèi)容。

    運(yùn)行容器后,會(huì)出現(xiàn)如下所示的信息:

    2020-10-16?03:35:28?+0000?[info]:?#0?fluent/log.rb:327:info:?fluentd?worker?is?now?running?worker=0

    這意味著 fluentd 已經(jīng)啟動(dòng)并運(yùn)行了?,F(xiàn)在我們知道了 fluentd 是如何運(yùn)行的了,接下來我們來看看配置文件的一些細(xì)節(jié)。

    拆分日志

    現(xiàn)在我們的日志已經(jīng)在 fluentd 中工作了,我們可以開始對(duì)它做一些更多的處理。

    現(xiàn)在我們只有一個(gè)輸入和一個(gè)輸出,所以我們所有的日志都混在一起,我們想從訪問日志中獲取更多的信息。要做到這一點(diǎn),我們首先要確定哪些是訪問日志,比方說通過 /^(?:[0-9]{1,3}\.){3}[0-9]{1,3}.*/ (將查找以 IP 開頭的行)來 grepping 我們所有的訪問日志,并將排除應(yīng)用日志,配置如下所示。

    <match?ninja.var.log.kong**>
    ??@type?rewrite_tag_filter
    ??<rule>
    ????key?log
    ????pattern?/^(?:[0-9]{1,3}\.){3}[0-9]{1,3}.*/
    ????tag?access.log.${tag}
    ??rule>
    ??<rule>
    ????key?log
    ????pattern?.*
    ????tag?app.log.${tag}
    ??rule>
    match>

    上面的配置信息:

    • :表示我們將匹配所有以 ninja.var.log.kong 開頭的標(biāo)簽。
    • @type rewrite_tag_filter:我們將要使用的插件類型。
    • 第一個(gè) 部分:我們?cè)谌罩局衅ヅ?/^(?:[0-9]{1,3}\.){3}[0-9]{1,3}.*/ 正則表達(dá)式,對(duì)于找到的每個(gè)日志行,添加一個(gè) access.log. 的標(biāo)簽前綴,比如 access.log.ninja.var.log.kong.log 這樣的標(biāo)簽。
    • 第二個(gè) 部分:我們?cè)谌罩局衅ヅ淦渌袃?nèi)容,添加 app.log 這樣的標(biāo)簽前綴,類似于 app.log.ninja.var.log.kong.log 這樣的標(biāo)簽。

    通過這個(gè)配置,我們?cè)诠艿乐性黾恿艘粋€(gè)新的配置。

    現(xiàn)在,如果我們?nèi)ミ\(yùn)行容器則會(huì)報(bào)錯(cuò),因?yàn)?rewrite_tag_filter 不是 fluentd 的核心插件,所以我們?cè)谶\(yùn)行 fluentd 之前先安裝它。

    $?docker?run?-u?root?-ti?--rm?\
    -v?$(pwd)/etc:/fluentd/etc?\
    -v?$(pwd)/log:/var/log/?\
    -v?$(pwd)/output:/output?\
    fluent/fluentd:v1.11-debian-1?bash?-c?"gem?install?fluent-plugin-rewrite-tag-filter?&&?fluentd?-c?/fluentd/etc/fluentd.conf?-v"

    我們?cè)谶\(yùn)行 fluend 命令之前先執(zhí)行 gem install fluent-plugin-rewrite-tag-filter 來安裝插件。

    現(xiàn)在我們應(yīng)該在輸出日志中看到一些不同的新了,讓我們檢查一下之前同樣的6行日志。

    2020-05-10T17:04:17+00:00?app.log.ninja.var.log.kong.log?{"log":"2020/05/10?17:04:16?[warn]?35#0:?*4?[lua]?globalpatches.lua:47:?sleep():?executing?a?blocking?'sleep'?(0.004?seconds),?context:?init_worker_by_lua*\n","stream":"stderr"}
    2020-05-10T17:04:17+00:00?app.log.ninja.var.log.kong.log?{"log":"2020/05/10?17:04:16?[warn]?33#0:?*2?[lua]?globalpatches.lua:47:?sleep():?executing?a?blocking?'sleep'?(0.008?seconds),?context:?init_worker_by_lua*\n","stream":"stderr"}
    2020-05-10T17:04:17+00:00?app.log.ninja.var.log.kong.log?{"log":"2020/05/10?17:04:17?[warn]?32#0:?*1?[lua]?mesh.lua:86:?init():?no?cluster_ca?in?declarative?configuration:?cannot?use?node?in?mesh?mode,?context:?init_worker_by_lua*\n","stream":"stderr"}
    2020-05-10T17:04:30+00:00?access.log.ninja.var.log.kong.log?{"log":"35.190.247.57?-?-?[10/May/2020:17:04:30?+0000]?\"GET?/?HTTP/1.1\"?404?48?\"-\"?\"curl/7.59.0\"\n","stream":"stdout"}
    2020-05-10T17:05:38+00:00?access.log.ninja.var.log.kong.log?{"log":"35.190.247.57?-?-?[10/May/2020:17:05:38?+0000]?\"GET?/users?HTTP/1.1\"?401?26?\"-\"?\"curl/7.59.0\"\n","stream":"stdout"}
    2020-05-10T17:06:24+00:00?access.log.ninja.var.log.kong.log?{"log":"35.190.247.57?-?-?[10/May/2020:17:06:24?+0000]?\"GET?/users?HTTP/1.1\"?499?0?\"-\"?\"curl/7.59.0\"\n","strea

    與之前唯一不同的是,現(xiàn)在訪問日志和應(yīng)用日志有不同的標(biāo)簽l ,這對(duì)它們做進(jìn)一步的處理是非常有用的。

    解析訪問日志

    接下來我們來添加一個(gè)解析器插件來從訪問日志中提取有用的信息,在 rewrite_tag_filter 之后使用這個(gè)配置。

    <filter?access.log.ninja.var.log.kong.log>
    ??@type?parser
    ??key_name?log
    ??<parse>
    ????@type?nginx
    ??parse>
    filter>

    我們來分析下這個(gè)配置:

    • 我們明確地過濾了access.log.ninja.var.log.kong.log 這個(gè)標(biāo)簽
    • 過濾器的類型是 parser
    • 我們將對(duì)日志內(nèi)容的 log 這個(gè) key 的內(nèi)容進(jìn)行解析
    • 由于這些都是 nginx 的訪問日志,所以這里我們使用 @type nginx 的解析器進(jìn)行解析。

    這是我們的日志收集管道現(xiàn)在的樣子。

    我們?cè)僦匦逻\(yùn)行 docker 容器,查看日志,Kong 的訪問日志應(yīng)該是這樣的了。

    2020-05-10T17:04:30+00:00?access.log.ninja.var.log.kong.log?{"remote":"35.190.247.57","host":"-","user":"-","method":"GET","path":"/","code":"404","size":"48","referer":"-","agent":"curl/7.59.0","http_x_forwarded_for":""}

    這是之前日志中的第一個(gè)訪問日志,標(biāo)簽是一樣的,但是現(xiàn)在日志內(nèi)容完全不同了,我們的鍵從 log 和 stream,變成了 remote、host、user、 method、path、code、size、referer、agent 和 http_x_forwarded_for,如果我們把這個(gè)日志輸出到 elasticsearch 中,我們就可以通過method=GET 或者其他任何組合方式進(jìn)行過濾了。

    Geoip 插件

    此外,我們還可以使用 geoip 插件應(yīng)用到 remote 字段中,來獲取訪問我們接口的地理位置。配置如下所示:

    #?Geoip?過濾器
    <filter?access.log.ninja.var.log.kong.log>
    ??@type?geoip

    ??#?指定一個(gè)或多個(gè)有?ip?地址的?geoip?查詢字段
    ??geoip_lookup_keys?remote

    ??#?Set?adding?field?with?placeholder?(more?than?one?settings?are?required.)
    ??<record>
    ????city????????????${city.names.en["remote"]}
    ????latitude????????${location.latitude["remote"]}
    ????longitude???????${location.longitude["remote"]}
    ????country?????????${country.iso_code["remote"]}
    ????country_name????${country.names.en["remote"]}
    ????postal_code?????${postal.code["remote"]}
    ??record>

    ??#?避免?elasticsearch?的?stacktrace?錯(cuò)誤
    ??skip_adding_null_record??true
    filter>

    再來分析下這個(gè)配置:

    • 明確過濾 access.log.ninja.var.log.kong.log 這個(gè)標(biāo)簽的日志。
    • 過濾器的類型是 geoip
    • 我們將使用日志中的 remote 這個(gè) key 來進(jìn)行 geoip 查找
    • 其余的都是標(biāo)準(zhǔn)配置

    同樣要在 docker 容器中使用 geoip 這個(gè)插件,我們需要首先安裝,但是這個(gè)插件的安裝稍微麻煩一點(diǎn),因?yàn)槲覀冃枰惭b一些 debian 依賴包,我們可以使用如下所示的命令來進(jìn)行安裝配置(當(dāng)然也可以重新自定義一個(gè) Docker 鏡像):

    $?docker?run?-u?root?-ti?--rm?\
    -v?$(pwd)/etc:/fluentd/etc?\
    -v?$(pwd)/log:/var/log/?\
    -v?$(pwd)/output:/output?\
    fluent/fluentd:v1.11-debian-1?bash?-c?"apt?update?&&?apt?install?-y?build-essential?libgeoip-dev?libmaxminddb-dev?&&?gem?install?fluent-plugin-rewrite-tag-filter?fluent-plugin-geoip?&&?fluentd?-c?/fluentd/etc/fluentd.conf?-v"

    我們可以看到在啟動(dòng)命令中我們添加了額外的 apt 命令,并添加了一個(gè) fluent-plugin-geoip 插件,運(yùn)行該命令后,我們可以在日志中看到一些額外的字段,這就是 geoip 插件的配置結(jié)果:

    2020-05-10T17:04:30+00:00?access.log.ninja.var.log.kong.log?{"remote":"35.190.247.57","host":"-","user":"-","method":"GET","path":"/","code":"404","size":"48","referer":"-","agent":"curl/7.59.0","http_x_forwarded_for":"","city":"Mountain?View","latitude":37.419200000000004,"longitude":-122.0574,"country":"US","country_name":"United?States","postal_code":"94043"}

    總結(jié)

    在這篇文章中,我們使用 fluent-plugin-retwrite-tag-filter 插件來拆分我們的日志,并使用 fluent-plugin-geoip 插件來獲取訪問我們接口的客戶端地理位置信息,fluentd 功能是非常強(qiáng)大的,有著豐富的插件可以幫助我們實(shí)現(xiàn)很多強(qiáng)大的需求。

    原文鏈接:https://medium.com/swlh/fluentd-splitting-logs-2a778cd6bdfa


    訓(xùn)練營(yíng)推薦





    ?點(diǎn)擊屏末?|??|?即刻學(xué)習(xí)

    瀏覽 70
    點(diǎn)贊
    評(píng)論
    收藏
    分享

    手機(jī)掃一掃分享

    分享
    舉報(bào)
    評(píng)論
    圖片
    表情
    推薦
    點(diǎn)贊
    評(píng)論
    收藏
    分享

    手機(jī)掃一掃分享

    分享
    舉報(bào)
    <p id="m2nkj"><option id="m2nkj"><big id="m2nkj"></big></option></p>
    <strong id="m2nkj"></strong>
    <ruby id="m2nkj"></ruby>

    <var id="m2nkj"></var>
  • 小處女末发育嫩苞AV | 五月激情婷婷基地 | 操逼精品免费视频 | 小B又骚又紧日不死你视频免费 | 91丨色丨国产熟女蘑菇 | 色婷婷做视频网站 | 另类视频在线观看 | 日韩电影A片在线 | 日韩一级在线播放 | 97超碰免费在线 |