fluent-bit收集springboot日志的一次小尝试

2,285 阅读3分钟

编写原因

本文只是简单的窥探下fluent-bit的日志收集demo,主要是因为现在项目的ELK搭的太烂了,Kibana上日志显示格式过于潦草,所以自己就无聊尝试下fluent-bit。

目前公司中的ELK显示出现的效果是这样的:

image.png

可以看出日志主体直接作为一列展示,日志级别和日志信息等并没有分开,而且网上大部分的文章都是这样的,这种情况下如果出了报错堆栈检索起来也不太好找,而我认为的kibana中日志展示应该是这样:

image.png

日志级别、线程和主要信息分别占一列,甚至异常栈都可以作为一列单独保存,例如这样:

image.png

image.png

fluent-bit尝试

fluent-bit官方文档个人认为比filebeat的官方文档更易读,而且由于最近考过了CKA对K8S系的组件都感兴趣,所以就想尝试下fluent-bit。以下使用了简单的docker启动+springboot项目本地运行的方式,我觉得K8S中可以作为边车和微服务放在一起。

fluent-bit核心步骤为:INPUT -> PARSER -> FILTER -> BUFFER -> ROUTER -> OUTPUT

官方文档(官方文档真的特别好使)中主要的文档章节:

  1. CONCEPTS:主要核心概念讲解
  2. INSTALLATION:各种环境的安装
  3. ADMINISTRATION -> Configuring Fluent Bit:介绍了conf文件的主要配置方法
  4. DATA PIPELINE:介绍了每一步的配置方式

FluentBit的主要配置文件为fluent-bit.conf

Parser相关操作需要单独定义一个conf文件,然后在主配置文件中引入。

具体实现步骤:

  1. application.yml中配置logging将日志输出到文件。

     # 仅配置path情况下文件名默认为spring.log
    logging:
     file:
         path: /home/fan/fluent-bit/app/log
    
  2. 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
    
  3. 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"
    
  4. 运行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都简单。