接入ELK-filebeat-sleuth方式

接入ELK - filebeat-sleuth方式

为方便日志查找,需要统一日志打印格式。
目前有两种方案,主要在于收集日志方式的区别

方式一:采用 Logback 直接推送数据至 Logstash 存入 ES
方式二:采用 FileBeat 读取日志文件,由 Logstash 解析后存入 ES

此处介绍方式二 采用 FileBeat 读取日志文件 的改造方法,大致分为以下几步:

修改pom,引入依赖(可选)
修改日志配置文件,替换logback日志配置
服务器部署 FileBeat 修改配置文件并启动
进入 Kibana 配置索引模式

1、引入依赖(可选)

引入 sleuth 依赖的目的是为了生成链路追踪ID,Kibana中可根据此ID跨多个应用搜索一次请求的所有日志,如不引入则不生成链路追踪ID,即无法跨应用查询日志。

情况一
如项目中引用了 spring-cloud-dependencies 直接添加以下依赖即可

     <!-- 链路追踪 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-sleuth</artifactId>
        </dependency>

情况二
如项目中未使用 spring-cloud-dependencies
需确定项目所用 springboot 版本对应的 sleuth 版本 (查看版本对应关系),然后引入依赖

        <!-- 链路追踪 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-sleuth</artifactId>
            <version>版本号</version>
        </dependency>

sleuth 常见问题处理:

问题一
问题描述:引入此依赖后,项目启动一半卡住无法继续启动
问题原因:是由于 sleuth 和 redis 线程冲突造成阻塞
解决方法:在项目配置文件中添加如下配置即可 
spring:
    sleuth:
      redis:
        enabled: false

2、修改日志配置文件

将项目中的 logback-spring.xml 修改为如下内容

<?xml version="1.0" encoding="UTF-8" ?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">

    <springProperty scope="context" name="spring.application.name" source="spring.application.name"/>
    <springProperty scope="context" name="logging.file.max-history" source="logging.file.max-history"/>
    <springProperty scope="context" name="logging.level.root" source="logging.level.root"/>

    <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_HOME" value="./logs/${spring.application.name}"/>

    <!-- CONSOLE -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <Pattern>%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){blue} | %clr(%5p){highlight} | %clr(${HOSTNAME:-HOSTNAME}){red} | %clr(%X{X-B3-TraceId}){green} | %clr(%X{X-B3-SpanId}){green} | %clr(${PID:- }){magenta} | %clr(%15.15t){yellow} | %clr(%-40.40logger{39}){cyan} %clr(|){highlight} %msg%n%wEx</Pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <appender name="ASYNC_CONSOLE" class="ch.qos.logback.classic.AsyncAppender">
        <appender-ref ref="CONSOLE"/>
    </appender>

    <!-- FILE -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <append>true</append>
        <file>${LOG_HOME}/${spring.application.name}.log</file>
        <!--<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>${logging.level.root:-INFO}</level>
        </filter>-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>${LOG_HOME}/%d{yyyy-MM}/${HOSTNAME:-HOSTNAME}.log.%d{yyyy-MM}.%i.gz</FileNamePattern>
            <MaxHistory>${logging.file.max-history:-1826}</MaxHistory>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>${logging.file.max-size:-100MB}</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <encoder>
            <Pattern> %d{yyyy-MM-dd HH:mm:ss.SSS} | %5p | ${HOSTNAME:-HOSTNAME} | %X{X-B3-TraceId} | %X{X-B3-SpanId} | ${PID:- } | %15.15t | %-40.40logger{39} | %msg%n%wEx </Pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <appender name="ASYNC_FILE" class="ch.qos.logback.classic.AsyncAppender">
        <appender-ref ref="FILE"/>
    </appender>

    <root>
        <level value="${logging.level.root:-INFO}"/>
        <springProfile name="dev,test">
            <appender-ref ref="ASYNC_CONSOLE"/>
        </springProfile>
        <appender-ref ref="ASYNC_FILE"/>
    </root>

</configuration>

一些说明

spring.application.name 为当前应用的名称
logging.file.max-history 日志最长保留时间,如不配置默认为5年
logging.level.root 日志级别,如不配置默认为 INFO

注意事项

sleuth 新旧版本之间获取 traceId 和 spanId 值的方式有差异,请注意修改 logback-spring.xml 日志配置中对应的取值表达式。
旧版本是:%X{X-B3-TraceId} | %X{X-B3-SpanId}
新版本是:%X{traceId} | %X{spanId}

详细请参考 sleuth 具体的实现类:org.springframework.cloud.sleuth.autoconfig.TraceEnvironmentPostProcessor

2.x 版本
在这里插入图片描述3.x 版本
在这里插入图片描述

3、部署FileBeat

在项目所在服务器部署 FileBeat 部署步骤:

复制FileBeat至应用服务器,文件在共享NAS盘,路径:/home/app/data/tool/filebeat-7.14.0-linux-x86_64.tar
在解压目录内创建配置文件 filebeat-logstash.yaml 并修改配置内容
进入安装目录,启动FileBeat

配置文件内容:

filebeat.inputs:
- type: log
  enabled: true
  paths:
    #日志文件的详细地址,多个文件支持通配符
    - /home/app/service/assist/logs/assist/assist*.log

  #合并多行日志
  multiline:
    #定义行开头的正则
    pattern: '^[\d]{4}-[\d]{2}-[\d]{2}'
    #不匹配正则的合并到上一行
    negate: true
    #合并到上一行的末尾
    match: after

  fields:
    #项目名称
    application: assist
    #服务器的IP地址
    hostip: IP地址
  fields_under_root: true


setup.template.settings:
  index.number_of_shards: 1
output.logstash:
  hosts: ["IP:PORT"]

需修改内容:

修改 paths 项,改成日志文件的地址改成项目日志文件的路径
修改 application 项,改成应用名称修改为项目的名称,请和项目中 spring.application.name 保持一致
修改 hostip 项,改成应用所在服务器的IP地址 

FileBeat 启动脚本:

nohup ./filebeat -e -c filebeat-logstash.yaml > /dev/null 2>&1 &

fileBeat 常见问题处理:

问题一
问题描述:如启动后发现 Kibana 中找不到项目对应的索引
问题原因:filebeat-logstash.yaml 中日志路径配置错误
处理方法:重新启动 FileBeat 查看日志寻找错误原因。解决完错误后,建议将 FileBeat 使用上一条命令重新启动,避免输出不必要的日志占用磁盘空间。

输出 FileBeat 日志 
 #将日志输出到 filebeat-log.log
 nohup ./filebeat -e -c filebeat-logstash.yaml > filebeat-log.log 2>&1 &

问题二
问题描述:启动 FileBeat 时报 can only be writable by the owner but the permissions are xxx
问题原因:filebeat-logstash.yaml 文件权限不正确
处理方法:将 FileBeat 的配置文件 filebeat-logstash.yaml 权限修改为 755

修改权限命令:

 chmod 755 filebeat-logstash.yaml

4、配置Kibana

修改完成后,进入 kibana 查看项目对应索引是否已创建,确认创建成功后添加索引模式
详细步骤请查看 Kibana创建索引模式

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,可以看出以下是关于Docker Compose配置ELK(Elasticsearch、Logstash和Kibana)和Filebeat的步骤: 1. 首先,拉取所需的镜像,包括Elasticsearch、Kibana、Logstash和Filebeat。例如,使用以下命令拉取特定版本的镜像: ``` docker pull elasticsearch:7.16.1 docker pull kibana:7.16.1 docker pull logstash:7.16.1 docker pull elastic/filebeat:7.16.1 ``` 2. 创建一个自定义网络,以便ELK容器可以相互通信。例如,使用以下命令创建一个名为"somenetwork"的网络: ``` docker network create somenetwork ``` 3. 配置Elasticsearch。根据提供的引用\[2\],可以在指定的目录(例如`/mydata/elk/elasticsearch/conf`)中创建一个配置文件(例如`elasticsearch.yml`),并根据需要进行配置。例如,设置集群名称、主机IP和允许跨域等。 4. 配置Kibana。根据提供的引用\[2\],可以在指定的目录(例如`/mydata/elk/kibana/conf`)中创建一个配置文件(例如`kibana.yml`),并根据需要进行配置。例如,设置服务器名称、主机IP和与Elasticsearch的连接等。 5. 配置Logstash。根据提供的引用\[3\],可以在指定的目录(例如`/mydata/elk/logstash/conf`)中创建一个配置文件(例如`logstash.yml`),并根据需要进行配置。例如,设置集群名称、主机IP和允许跨域等。 6. 配置Filebeat。根据提供的引用\[1\],可以在指定的目录(例如`/mydata/elk/filebeat/conf`)中创建一个配置文件(例如`filebeat.yml`),并根据需要进行配置。例如,设置Elasticsearch的主机IP和端口等。 请注意,以上步骤仅提供了基本的配置示例,实际配置可能因环境和需求而有所不同。您可以根据自己的需求进行相应的配置。 #### 引用[.reference_title] - *1* *2* *3* [docker-compose配置elk + filebeat(版本:7.16.1)](https://blog.csdn.net/paidaxinga_/article/details/122218054)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值