摘要:最近我們遇到奇葩的需求,不得不利用編寫的,來滿足需求。所以找到官方的代碼倉庫,下來,稍作更改。新的如下注意增加了。使用姿勢使用比較簡單的。遇到問題和使用一些不明白的地方,解決起來費力。官方文檔寫的也不夠詳細,只是描述了個大概。
前言
之前我們介紹過fluent bit這個日志收集神器。最近我們遇到奇葩的需求,不得不利用lua編寫fluent bit的filter,來滿足需求。
首先介紹一下需求:
非容器的日志團隊使用filebeat, 其配置文件部分如下:
processors: - dissect: tokenizer: "/data/logs/%{appname}/%{filename}.log" field: "source" target_prefix: ""
即需要從日志record的source filed 提取appname和filename兩個filed。
fluent bit 并沒有如此的插件,所以不得不自己實現。
實現 lua編寫filter規范官方給出的示例如下:
function cb_print(tag, timestamp, record) return code, timestamp, record endFunction 輸入參數 Function Arguments
name | description |
---|---|
tag | Name of the tag associated with the incoming record. |
timestamp | Unix timestamp with nanoseconds associated with the incoming record. The original format is a double (seconds.nanoseconds) |
record | Lua table with the record content |
Each callback must return three values:
name | data type | description |
---|---|---|
code | integer | The code return value represents the result and further action that may follows. If code equals -1, means that filter_lua must drop the record. If _code_ equals 0 the record will not be modified, otherwise if code equals 1, means the original timestamp or record have been modified so it must be replaced by the returned values from timestamp (second return value) and record (third return value). |
timestamp | double | If code equals 1, the original record timestamp will be replaced with this new value. |
record | table | if code equals 1, the original record information will be replaced with this new value. Note that the format of this value must be a valid Lua table. |
理解上面的規范可以結合下面的寫法。注意返回值的code。
代碼實現編寫實現類似功能的lua文件,如下:
function dissect(tag, timestamp, record) source = record["source"] if (source == nil) then return 0, 0, 0 else new_record = record local result = { } local from = 1 local delim_from, delim_to = string.find( source, "/", from ) while delim_from do table.insert( result, string.sub( source, from , delim_from-1 ) ) from = delim_to + 1 delim_from, delim_to = string.find( source, "/", from ) end table.insert( result, string.sub( source, from ) ) new_record["appname"] = result[7] new_record["filename"] = string.sub( result[8], 1, -5 ) return 1, timestamp, new_record end end
備注:
在我們k8s環境下,業務日志掛盤路徑類似于下面的格式:source = /data/logs/default/tomcat/742473c7-17dc-11e9-afc5-0a07a5c4fbe2/appname/filename.log
result[7]之所以出現這種及其容易出現bug的寫法,一是由于我們這邊有嚴格的日志規范,另外,只是給大家提供一種lua寫filter的思路。
制作鏡像我們是基于fluent bit 1.0.2 。所以找到官方的代碼倉庫,git clone 下來,稍作更改。
新的dockerfile如下:
FROM debian:stretch as builder # Fluent Bit version ENV FLB_MAJOR 1 ENV FLB_MINOR 0 ENV FLB_PATCH 2 ENV FLB_VERSION 1.0.2 ENV DEBIAN_FRONTEND noninteractive ENV FLB_TARBALL http://github.com/fluent/fluent-bit/archive/v$FLB_VERSION.zip RUN mkdir -p /fluent-bit/bin /fluent-bit/etc /fluent-bit/log /tmp/fluent-bit-master/ RUN apt-get update && apt-get install -y --no-install-recommends build-essential cmake make wget unzip libssl1.0-dev libasl-dev libsasl2-dev pkg-config libsystemd-dev zlib1g-dev ca-certificates && wget -O "/tmp/fluent-bit-${FLB_VERSION}.zip" ${FLB_TARBALL} && cd /tmp && unzip "fluent-bit-$FLB_VERSION.zip" && cd "fluent-bit-$FLB_VERSION"/build/ && rm -rf /tmp/fluent-bit-$FLB_VERSION/build/* WORKDIR /tmp/fluent-bit-$FLB_VERSION/build/ RUN cmake -DFLB_DEBUG=On -DFLB_TRACE=Off -DFLB_JEMALLOC=On -DFLB_TLS=On -DFLB_SHARED_LIB=Off -DFLB_EXAMPLES=Off -DFLB_HTTP_SERVER=On -DFLB_IN_SYSTEMD=On -DFLB_OUT_KAFKA=On .. RUN make -j $(getconf _NPROCESSORS_ONLN) RUN install bin/fluent-bit /fluent-bit/bin/ # Configuration files COPY fluent-bit.conf parsers.conf parsers_java.conf parsers_extra.conf parsers_openstack.conf parsers_cinder.conf plugins.conf /fluent-bit/etc/ COPY dissect.lua /fluent-bit/bin/ FROM gcr.io/distroless/cc MAINTAINER Eduardo SilvaLABEL Description="Fluent Bit docker image" Vendor="Fluent Organization" Version="1.1" COPY --from=builder /usr/lib/x86_64-linux-gnu/*sasl* /usr/lib/x86_64-linux-gnu/ COPY --from=builder /usr/lib/x86_64-linux-gnu/libz* /usr/lib/x86_64-linux-gnu/ COPY --from=builder /lib/x86_64-linux-gnu/libz* /lib/x86_64-linux-gnu/ COPY --from=builder /usr/lib/x86_64-linux-gnu/libssl.so* /usr/lib/x86_64-linux-gnu/ COPY --from=builder /usr/lib/x86_64-linux-gnu/libcrypto.so* /usr/lib/x86_64-linux-gnu/ # These below are all needed for systemd COPY --from=builder /lib/x86_64-linux-gnu/libsystemd* /lib/x86_64-linux-gnu/ COPY --from=builder /lib/x86_64-linux-gnu/libselinux.so* /lib/x86_64-linux-gnu/ COPY --from=builder /lib/x86_64-linux-gnu/liblzma.so* /lib/x86_64-linux-gnu/ COPY --from=builder /usr/lib/x86_64-linux-gnu/liblz4.so* /usr/lib/x86_64-linux-gnu/ COPY --from=builder /lib/x86_64-linux-gnu/libgcrypt.so* /lib/x86_64-linux-gnu/ COPY --from=builder /lib/x86_64-linux-gnu/libpcre.so* /lib/x86_64-linux-gnu/ COPY --from=builder /lib/x86_64-linux-gnu/libgpg-error.so* /lib/x86_64-linux-gnu/ COPY --from=builder /fluent-bit /fluent-bit # EXPOSE 2020 # Entry point CMD ["/fluent-bit/bin/fluent-bit", "-c", "/fluent-bit/etc/fluent-bit.conf"]
注意增加了 COPY dissect.lua /fluent-bit/bin/ 。
然后就build鏡像即可。
使用姿勢使用比較簡單的。demo如下:
[FILTER] Name lua Match app.* script /fluent-bit/bin/dissect.lua call dissect
script lua腳本的存放路徑。
call 即為lua函數名。
總結通過寫這個filter,有一下幾個感悟吧。
官方的鏡像基于谷歌的distroless鏡像,沒有shell,沒有包管理,調試起來很費力。平時的業務容器化場景中,明顯的不合適,與阿里的富容器思維南轅北轍。當然除非你公司的業務開發能力足夠強。
fluent bit 相關的資料還是有點少。遇到問題和使用一些不明白的地方,解決起來費力。除非你是c專家。官方文檔寫的也不夠詳細,只是描述了個大概。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/32847.html
摘要:最近我們遇到奇葩的需求,不得不利用編寫的,來滿足需求。所以找到官方的代碼倉庫,下來,稍作更改。新的如下注意增加了。使用姿勢使用比較簡單的。遇到問題和使用一些不明白的地方,解決起來費力。官方文檔寫的也不夠詳細,只是描述了個大概。 前言 之前我們介紹過fluent bit這個日志收集神器。最近我們遇到奇葩的需求,不得不利用lua編寫fluent bit的filter,來滿足需求。 首先介紹...
摘要:是一個開源和多平臺的,它允許您從不同的來源收集數據日志,統一并將它們發送到多個目的地。例如日志收集日志分析主要講部署的集群。日志主要有和的日志,一般采用部署,自然而然就是要支持格式日志的采集。業務落盤的日志。部署方案采取部署。 前言 收集日志的組件多不勝數,有ELK久負盛名組合中的logstash, 也有EFK組合中的filebeat,更有cncf新貴fluentd,另外還有大數據領域...
摘要:是一個開源和多平臺的,它允許您從不同的來源收集數據日志,統一并將它們發送到多個目的地。例如日志收集日志分析主要講部署的集群。日志主要有和的日志,一般采用部署,自然而然就是要支持格式日志的采集。業務落盤的日志。部署方案采取部署。 前言 收集日志的組件多不勝數,有ELK久負盛名組合中的logstash, 也有EFK組合中的filebeat,更有cncf新貴fluentd,另外還有大數據領域...
摘要:采用實現的插件前言目前社區日志采集和處理的組件不少,之前方案中的,社區中的,方案中的以及大數據用到比較多的。適合采用的方案,實現日志中心化收集的方案。主要負責采集,負責處理和傳送。 采用golang實現Fluent Bit的output插件 前言 目前社區日志采集和處理的組件不少,之前elk方案中的logstash,cncf社區中的fluentd,efk方案中的filebeat,以及大...
摘要:采用實現的插件前言目前社區日志采集和處理的組件不少,之前方案中的,社區中的,方案中的以及大數據用到比較多的。適合采用的方案,實現日志中心化收集的方案。主要負責采集,負責處理和傳送。 采用golang實現Fluent Bit的output插件 前言 目前社區日志采集和處理的組件不少,之前elk方案中的logstash,cncf社區中的fluentd,efk方案中的filebeat,以及大...
閱讀 1446·2021-11-24 09:39
閱讀 3626·2021-09-29 09:47
閱讀 1571·2021-09-29 09:34
閱讀 3067·2021-09-10 10:51
閱讀 2536·2019-08-30 15:54
閱讀 3216·2019-08-30 15:54
閱讀 869·2019-08-30 11:07
閱讀 1004·2019-08-29 18:36