当前位置: 首页 > Linux

日志系统EFK后续:fluent-bitserviceindependent

时间:2023-04-06 03:24:28 Linux

上一篇日志系统EFK搭建,提到了一些未解决的问题,同时也发现了一些新的问题,比如docker重启时收集日志的时间有回归(日志采集的offset记录有问题)。问老大的意思是,当容器重启的时候,直接把里面的fluent-bit进程杀掉,导致记录logreadoffset的db没有及时持久化。所以现在想关掉大鹏原来自带的fluent-bit,开一个fluent-bit容器收集其他容器挂载的本地日志,这样只要fluent-bit容器运行正常就可以了。fluent-bit服务首先使用官网的fluent-bit镜像。这里,为了测试,使用调试版本fluent-bit:image:fluent/fluent-bit:1.2-debugcontainer_name:fluent-bitrestart:on-failure:3volumes:-/data/var/fluent-bit/etc/:/fluent-bit/etc/-/data/var/fluent-bit/log/:/fluent-bit/log/-/data/var/fluent-bit/db/:/fluent-bit/db/-/data/logs/:/var/logs/environment:-hostname=${host_ip}-fluentd_host=${host_ip}-fluentd_port=24224#fluent-bit容器内部收集日志路径配置-fbInputPath=/var/logs/*/*.log#(测试发现fbInputPath不支持逗号分隔的多路径)#-fbInputPath=/var/logs/admin/*.log,/var/logs/common/*.日志、/var/logs/crm/*.l??og、/var/logs/delivery/*.log、/var/logs/openApi/*。日志,/var/logs/order/*.log,/var/logs/payment/*.log,/var/logs/product/*.log,/var/logs/purchase/*.log,/var/logs/schedule/*.log,/var/logs/wanboMiniprogram/*.l??og,/var/logs/wanboService/*.log,/var/logs/wanboWechatService/*.log,/var/logs/wechat/*.log-fbInputExcludePath=/var/logs/*/fluent*.log,/var/logs/*/console.log,/var/logs/*/gc*.log-fbInputTag=dapeng-LANG=zh_CN.UTF-8-TZ=CST-8labels:-project.source=-project.extra=public-image-project.depends=-project.owner=对应的fluent-bit配置文件/data/var/fluent-bit/etc:1.fluent-bit.conf[SERVICE]Flush1DaemonOFFLog_Level信息Log_File/fluent-bit/log/fluent-bit.logParsers_Fileparse_file.conf[INPUT]NametailPath${fbInputPath}Exclude_Path${fbInputExcludePath}标签${fbInputTag}多行Buffer_Chunk_Size2mbuffer_max_size30mMem_Buf_Limit32mDB.SyncNormaldb_count400Path_KeyfbKeyParser_Firstlinetail_multilinedb/fluent-bit/db/logs.db[FILTER]Namerecord_modifierMatch*Recordhostname${hostname}[FILTER]NamemodifyMatch*ConditionKey_Does_Not_Existmessage添加消息Key_Does_Not_Exist:message[FILTER]NamegrepMatch*ExcludemessageKey_Does_Not_Exist:message[OUTPUT]NameForwardMatch*Upstreamupstream.conf#Host${fluentd_host}#Port24224Retry_Limit1其中,INPUT的Path_Key:监听文件的名称会作为记录的一部分赋值和成为映射中的关键。即parse解析出来的记录中会有(fbKey->日志文件的路径)键值对。FILTERrecord_modifier:给record记录增加一个键值对(hostname->${hostname})。FILTERmodify:满足Condition条件后,修改记录(当记录中不存在messagekey时,添加键值对message->Key_Does_Not_Exist:message)FILTERgrep:匹配记录key,类似grep中shell(匹配的messagekey的值为Key_Does_Not_Exist:message排除这条记录)其中modify和grep一起用来过滤掉没有messagekey的记录2.parse_file.conf[PARSER]Nametail_multilineFormatregexRegex(?^\d{2}-\d{2}\d{2}:\d{2}:\d{2}\d{3})(?[^]+)(?[^]+)\[(?\w*)\]-(?.*)3.upstream.conf[UPSTREAM]名称fb-forward[NODE]名称upstream-fluentdhostfluentdserveripport24224注意,尝试通过${key}发现fluent-bit.conf文件来访问环境变量中的值,但是在upstream.conf文件中获取不到环境变量fluentd。修改需要在fluent.conf文件中添加一个filter来处理fluent-bit中Path_Key附加的文件路径,因为我们的log路径是/data/logs/[eachmoduletag]/*.log,所以rubyexpression可以通过enable_ruby从记录中解析出每个日志文件的tag。解析完成后,fb关键字段和数据移除:@typerecord_transformerenable_rubytag${record["fbKey"].split('/')[3]}remove_keysfbKeyok,这样改动之后,fluent-bit是独立的,我们只需要关注本地挂载的日志文件,其他服务的重启不会影响日志的收集。Todo我们可以将其他服务器定时同步的日志保存到单独的efk服务器中,路径遵循一定的规则如:/data/logs/moduletag/serverhostname/*.log这样就可以解析tag和hostname在不占用其他服务器资源的情况下流畅地输出。将服务与日志管理分开。也可以将fluent-bit采集服务放在需要日志采集的服务器上,然后将采集到的数据发送给日志服务器fluentd进行处理,其中fluentd->kafka->elasticsearch流程也为我们进行提供方便实时日志告警。我们只需要在Kafka中监控级别:ERROR级别的日志,然后做告警通知处理即可。参考官方文档:https://docs.fluentd.org/https://docs.fluentbit.io/man...