Fluent-Bit 微服务日志采集实战(开箱即用)

这篇具有很好参考价值的文章主要介绍了Fluent-Bit 微服务日志采集实战(开箱即用)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

场景

适用于采集spring-boot微服务日志,并将日志统一保存到ES数据库中

准备工作

1. fluent-bit方案

首先确定我们的方案,fluent-bit会部署在每一台运行java微服务的机器上,监听服务生成的日志文件,采集日志后转发到专门负责写入ES的FluentBit服务器上去。
fluent日志采集,微服务,架构,云原生,java

2. 日志格式化

在采集日志之前,我们首先要确保微服务的日志采用统一格式,并且为了后面写入ES更好的识别数据,我们采用了如下的格式。

注意这里日期的输出,我们采用了ISO8601格式,保留了时区,这是为了最终写入ES能保留时区,避免出现时间偏差。

<?xml version="1.0" encoding="UTF-8"?>
<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 -->
<!-- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true -->
<!-- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
<!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
<configuration scan="true" scanPeriod="10 seconds">
    <!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。 -->
    <springProperty scope="context" name="applicationId" source="spring.application.name"
                    defaultValue="defaultApplication"/>
    <springProperty scope="context" name="log.path" source="nuzarsurf.tracer.log-path"
                    defaultValue="logs"/>
    <!-- 彩色日志 -->
    <!-- 彩色日志依赖的渲染类 -->
    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
    <conversionRule conversionWord="wex"
                    converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
    <conversionRule conversionWord="wEx"
                    converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
    <!-- 彩色日志格式 -->
    <property name="LOG_LEVEL_PATTERN"
              value="%5p [${applicationId:-},%X{traceId:-},%X{spanId:-}]"/>
    <property name="CONSOLE_LOG_PATTERN"
              value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd'T'HH:mm:ss.SSSZ}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
    <property name="LOG_PATTERN"
              value="${LOG_PATTERN:-%d{yyyy-MM-dd'T'HH:mm:ss.SSSZ} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%15.15t] %-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>

    <!-- 控制台输出日志 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
            <charset class="java.nio.charset.Charset">UTF-8</charset>
        </encoder>
    </appender>

    <!-- 时间滚动输出 level为 INFO 日志 -->
    <appender name="DEFAULT_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在记录的日志文件的路径及文件名 -->
        <file>${log.path}/${applicationId}.log</file>
        <!--日志文件输出格式-->
        <encoder>
            <pattern>${LOG_PATTERN}</pattern>
            <charset>UTF-8</charset>
        </encoder>
        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 每天日志归档路径以及格式 -->
            <fileNamePattern>${log.path}/${applicationId}-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文件保留天数-->
            <maxHistory>2</maxHistory>
        </rollingPolicy>
        <!-- 此日志文件只记录info级别的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>info</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>ACCEPT</onMismatch>
        </filter>
    </appender>

    <!-- 时间滚动输出 level为 ERROR 日志 -->
    <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在记录的日志文件的路径及文件名 -->
        <file>${log.path}/${applicationId}_error.log</file>
        <!--日志文件输出格式-->
        <encoder>
            <pattern>${LOG_PATTERN}</pattern>
            <charset>UTF-8</charset>
        </encoder>
        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/${applicationId}_error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文件保留天数-->
            <maxHistory>2</maxHistory>
        </rollingPolicy>
        <!-- 此日志文件只记录ERROR级别的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    <!-- 日志输出级别 -->
    <root level="INFO">
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="DEFAULT_FILE"/>
        <appender-ref ref="ERROR_FILE"/>
    </root>
</configuration>

3. fluent-bit部署

# 安装
curl https://raw.githubusercontent.com/fluent/fluent-bit/master/install.sh | sh

# 运行
/opt/fluent-bit/bin/fluent-bit -c //etc/fluent-bit/fluent-bit.conf

4. fluent-bit配置

fluent-bit 的配置需要注意几点:

  1. 多行日志的读取
  2. 日志的regex匹配

特别注意fluent-bit最麻烦的地方其实就是日志的格式匹配了
^(?<time>[^ ]*)\s*(?<level>[^ ]*)\s\[(?<service>[^,]*),(?<traceId>[^,]*),(?<spanId>[^\]]*)\] (?<pid>[^ ]*) --- \[\s*(?<thread>[^\]]*)\] (?<logger>[^ ]*) *: (?<message>[^$]*)
以上正则表达式可以匹配
2023-07-13T10:48:25.984+0800 INFO [demo-web,traceId111,spanId222] 13212 — [ main] com.xxx.demo.DemoApplication : No active profile set, falling back to 1 default profile: “default”
自动解析日志

fluent日志采集,微服务,架构,云原生,java

fluent-bit我们需要把自定义的parser添加到/etc/fluent-bit/parsers.conf中去

[MULTILINE_PARSER]
    name          micro_mparser
    type          regex
    flush_timeout 1000
    #
    # rules |   state name  | regex pattern                                                                                      | next state
    # ------|---------------|---------------------------------------------------------------------------------------------------------------
    rule      "start_state"   "(?<time>[^ ]*)\s*(?<level>[^ ]*)\s\[(?<service>[^,]*),(?<traceId>[^,]*),(?<spanId>[^\]]*)\] (?<pid>[^ ]*) --- \[\s*(?<thread>[^\]]*)\] (?<logger>[^ ]*) *: (?<message>[^$]*)"            "stack"
    rule      "stack"         "^[a-zA-Z\s].*"                           "stack"

[PARSER]
    Name        micro_parser
    Format      regex
    Regex       (?<time>[^ ]*)\s*(?<level>[^ ]*)\s\[(?<service>[^,]*),(?<traceId>[^,]*),(?<spanId>[^\]]*)\] (?<pid>[^ ]*) --- \[\s*(?<thread>[^\]]*)\] (?<logger>[^ ]*) *: (?<message>[^$]*)
    Time_Key    time
    Time_Format %Y-%m-%dT%H:%M:%S.%L%z

然后配置我们需要监听的文件,这里使用到了我们的多行转换和字段提取

# 开启 multiline.parse 后,parser不生效,需要使用 filter 再次进行解析
[INPUT]
    Name              tail
    Path              /root/app/micro-test/logs/micro-test.log
    Tag               micro_test
    multiline.parser  micro_mparser
    db                micro.db
[FILTER]
    Name         parser
    Parser       micro_parser
    Match        micro_*
    Key_Name     log
    Reserve_Data On
    Preserve_Key Off

之后我们配置以下日志的输出output就行了,这里我放个简化的版本,直接输出到ES数据库文章来源地址https://www.toymoban.com/news/detail-810486.html

[OUTPUT]
    Name  es
    Match micro_*
    Host  xxx.xxx.xxx.xxx
    Port  9200
    Index micro.%Y.%m.%d
    tls On
    tls.verify Off
    HTTP_User elastic
    HTTP_Passwd xxxxxxxxxxxxxxxxxxxxxxxxx
    Suppress_Type_Name On

到了这里,关于Fluent-Bit 微服务日志采集实战(开箱即用)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • uniapp - 全平台兼容实现上传图片带进度条功能,用户上传图像到服务器时显示上传进度条效果功能(一键复制源码,开箱即用)

    uniapp小程序/h5网页/app实现上传图片并监听上传进度,显示进度条完整功能示例代码 一键复制,改下样式即可。

    2024年02月11日
    浏览(42)
  • Maven入门与开箱即用

    构建:编译代码,运行测试,打包,部署应用,运行服务器等; 依赖:项目依赖大量的第三方包,第三方包又依赖另外的包,对依赖包的管理非常麻烦。 Maven 翻译为“知识的积累”,“专家”,“行家”,是一个跨平台的项目管理工具; Maven 主要用作基于 Java 平台的项目(

    2024年02月06日
    浏览(39)
  • ChatGPT 克隆方案,开源了!开箱即用

    ChatGPT是一种基于人工智能技术的大型语言模型,它能够理解和处理人类自然语言,并且在回答问题、生成文本和模拟对话等方面表现出色。ChatGPT使用的是GPT-3.5架构,它在训练过程中接触了大量的语言数据,并利用这些数据学习语言的语法、结构和含义。这使得ChatGPT能够像人

    2024年02月05日
    浏览(49)
  • vue2 封装 webSocket 开箱即用

    第一步:    下载 webSocket  第二步:   需要在 main.js 中 引入  第三步:     封装相关的连接和断开    相关代码!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!  第四步:  引入使用 到这步接收信息已经OK了(记得和后端配合)    使用

    2024年02月14日
    浏览(38)
  • python笔记:第十章开箱即用的模块

    任何python程序都可以作为模块导入,并标明程序(模块)的位置 会在该文件夹里面自动生成一个 __pycache__ 文件夹,包含处理后的文件。(可删除,无影响) 在hello.py里面编写函数 在t13.py里面调用模块函数 运行结果 检查模块是作为程序运行还是被导入到另一个程序 如:在

    2024年02月17日
    浏览(46)
  • 开箱即用之MyBatisPlus XML 自定义分页

    2024年01月19日
    浏览(51)
  • ACDC:开箱即用的多租户数据集成平台

    新东方的一些核心业务存在单元写、中心入仓的场景,因此需要将数据从各单元的关系型数据库同步到中心,并异构存储到数据仓库之中。 技术团队最初使用 Apache Sqoop 以批的方式实现了这个能力。随着数据量的增长,这个方案很快暴露出了一些问题,如: 为了不影响业务,

    2023年04月16日
    浏览(41)
  • 开箱即用的ChatGPT替代模型,还可训练自己数据

    OpenAI 是第一个在该领域取得重大进展的公司,并且使围绕其服务构建抽象变得更加容易。 然而,便利性带来了集中化、通过中介的成本、数据隐私和版权问题。 而数据主权和治理是这些新的LLM服务提供商如何处理商业秘密或敏感信息的首要问题,用户数据已被用于预训练以

    2023年04月23日
    浏览(54)
  • 实战:ELK环境部署并采集springboot项目日志

    相信作为一个资深的搬砖人,在处理问题的时候免不了查看应用系统日志,且可以根据这个日志日志精准、快速的解决实际的问题。一般情况下我们的系统日志都放置在包的运行目录下面,非常不便于查看和分类。那么。今天我们就引入ELK的日志处理架构来解决它。 ELK组成及

    2024年02月17日
    浏览(38)
  • vue2 封装 webSocket 开箱即用(或 uni.connectSocket)

    第一步:    下载 webSocket  第二步:   需要在 main.js 中 引入  第三步:     封装相关的连接和断开    相关代码!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!  第四步:  引入使用 到这步接收信息已经OK了(记得和后端配合)    使用

    2024年02月09日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包