编写原因
本文只是简单的窥探下fluent-bit的日志收集demo,主要是因为现在项目的ELK搭的太烂了,Kibana上日志显示格式过于潦草,所以自己就无聊尝试下fluent-bit。
目前公司中的ELK显示出现的效果是这样的:
可以看出日志主体直接作为一列展示,日志级别和日志信息等并没有分开,而且网上大部分的文章都是这样的,这种情况下如果出了报错堆栈检索起来也不太好找,而我认为的kibana中日志展示应该是这样:
日志级别、线程和主要信息分别占一列,甚至异常栈都可以作为一列单独保存,例如这样:
fluent-bit尝试
fluent-bit官方文档个人认为比filebeat的官方文档更易读,而且由于最近考过了CKA对K8S系的组件都感兴趣,所以就想尝试下fluent-bit。以下使用了简单的docker启动+springboot项目本地运行的方式,我觉得K8S中可以作为边车和微服务放在一起。
fluent-bit核心步骤为:INPUT -> PARSER -> FILTER -> BUFFER -> ROUTER -> OUTPUT
官方文档(官方文档真的特别好使)中主要的文档章节:
- CONCEPTS:主要核心概念讲解
- INSTALLATION:各种环境的安装
- ADMINISTRATION -> Configuring Fluent Bit:介绍了conf文件的主要配置方法
- DATA PIPELINE:介绍了每一步的配置方式
FluentBit的主要配置文件为fluent-bit.conf
。
Parser相关操作需要单独定义一个conf文件,然后在主配置文件中引入。
具体实现步骤:
-
在
application.yml
中配置logging
将日志输出到文件。# 仅配置path情况下文件名默认为spring.log logging: file: path: /home/fan/fluent-bit/app/log
-
fluent-bit.conf
配置文件:# 引入parser文件 [SERVICE] parsers_file parser.conf [INPUT] tag log_test name tail path /app/log/spring.log # 将springboot中错误日志与错误栈中的空行过滤掉 skip_empty_lines on # 每次都会从文件头开始读,测试用不推荐打开 read_from_head true # 将错误日志由多行转为一行 [FILTER] name multiline match log_test multiline.key_content log multiline.parser multiline_stacktrace_parser # 将上一步中的log字段中的日志取出转换为json数据 [FILTER] name parser match log_test key_name log parser log_to_json_parser # 删除log字段 [FILTER] name record_modifier match log_test remove_key log # 打印到控制台 [OUTPUT] name stdout match * # 发送到Elasticsearch [OUTPUT] name es match log_test host 192.168.0.128 port 9200 index fluent-bit-log-test
-
Parser配置文件
# 将日志信息解析为Json格式数据 [PARSER] name log_to_json_parser format regex # regex (?<time>\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}.\d*)\s+(?<level>\S*)\s+(?<thread>\d* --- \[\s*\S*\][\s]*\S*)\s*:(?<message>.*) regex (?<time>\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}.\d*)\s+(?<level>\S*)\s+(?<thread>\d* --- \[\s*\S*\][\s]*\S*)\s*:(?<message>.*)(\n(?<trace>\S+:\s\S+(\n\s.*)*))* time_key time time_format %Y-%m-%d %H:%M:%S.%L # 利用多行转换插件,将ERROR信息和stacktrace结合到一行 [MULTILINE_PARSER] name multiline_stacktrace_parser type regex flush_timeout 1000 # Regex rules for multiline parsing # --------------------------------- # # configuration hints: # # - first state always has the name: start_state # - every field in the rule must be inside double quotes # # rules | state name | regex pattern | next state # ------|---------------|-------------------------------------------- rule "start_state" "/\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}.*/" "exception_name" rule "exception_name" "/(\w+\.)+\w+: .*/" "cont" rule "cont" "/^\s+at.*/" "cont"
-
运行fluent-bit容器,这里我只是简单的将spring.log放进了容器,etc下是fluent-bit默认的配置文件目录
docker run -v /home/fan/fluent-bit/app/log:/app/log -v /home/fan/fluent-bit/etc:/fluent-bit/etc --rm cr.fluentbit.io/fluent/fluent-bit:1.9.3
经过上述操作后就能够得到理想中的kibana日志了,其实官方文档中还有很多骚操作可以使用,感觉比logstash都简单。