ELK7、Logback、RabbitMQ、ILM配置滚动日志

前言

  • 环境如下:
操作系统:ubuntu
SrpingBoot:2.7.2
ELK:7.7.0
RabbitMQ:3.9.11
  • 整合Logback、ELK7.7、RabbitMQ
  • 使用索引模板及ILM策略自动管理索引生命周期
  • 可以配置自动删除XX天前的日志索引(仅此一家😊)
  • 此文章只作为配置教程,没有安装ES、Kibana、RabbitMQ的安装教程
    ,所有软件安装均基于Dcoker

logback配置

于resources目录下新建logback-spring.xml文件。以下文件内容只跟AmqpAppender相关,如有其他appender,请自行加入

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
    <!--定义日志文件的存储地址 -->
    <property name="LOG_HOME" value="../logs"/>

    <springProperty scope="context" name="springAppName" source="spring.application.name" />

    <!--日志发给RABBITMQ-->
    <appender name="RABBITMQ" class="org.springframework.amqp.rabbit.logback.AmqpAppender">
        <layout>
            <!--将日志作为json发送-->
            <pattern>
                {
                    "level": "%level",
                    "service": "${springAppName:-}",
                    "time": "%d{yyyy-MM-dd HH:mm:ss.SSS}",
                    "requestId": "%X{requestId}",
                    "trace": "%X{X-B3-TraceId:-}",
                    "span": "%X{X-B3-SpanId:-}",
                    "exportable": "%X{X-Span-Export:-}",
                    "pid": "${PID:-}",
                    "thread": "%thread",
                    "class": "%logger{40}",
                    "message": "%message"
                }
            </pattern>
        </layout>
        <addresses>IP:PORT</addresses>
        <username>账号</username>
        <password>密码</password>
        <applicationId>${springAppName}</applicationId>
        <virtualHost>test</virtualHost>
        <!--指定是否在appender启动时声明配置的交换器,如果不设置,默认为false。如果设置为true,则还需要设置交换器的类型、名称、持久性和自动删除属性。-->
        <declareExchange>true</declareExchange>
        <!--指定交换器的类型,可以是direct、fanout、topic或headers。只有在declareExchange为true时才有效。-->
        <exchangeType>direct</exchangeType>
        <!--指定交换器的名称,可以自定义。只有在declareExchange为true时才有效。-->
        <exchangeName>app.log</exchangeName>
        <!--指定生成路由键的模式,可以使用Logback的pattern语法。路由键用于将日志消息发送到匹配的队列。-->
        <routingKeyPattern>logstash</routingKeyPattern>
        <!--指定是否为每个日志消息生成一个唯一的ID,如果不设置,默认为false。如果设置为true,则日志消息的属性中会包含一个名为messageId的字段。-->
        <generateId>true</generateId>
        <!--指定将字符串转换为字节数组时使用的字符集,如果不设置,默认使用系统默认字符集。如果指定的字符集在当前平台不支持,则回退到使用系统字符集。-->
        <charset>UTF-8</charset>
        <!--指定交换器是否持久化,如果不设置,默认为true。只有在declareExchange为true时才有效。持久化的交换器可以在服务器重启后保留。-->
        <durable>true</durable>
        <!--指定日志消息的投递模式,可以是 PERSISTENT 或 NON_PERSISTENT。如果不设置,默认为 PERSISTENT 。投递模式决定了RabbitMQ是否应该持久化消息。持久化的消息可以在服务器重启后保留。-->
        <deliveryMode>NON_PERSISTENT</deliveryMode>
        <!--指定交换器是否自动删除,如果不设置,默认为 false 。只有在 declareExchange 为 true 时才有效。自动删除的交换器会在没有任何绑定队列时被删除。-->
        <autoDelete>false</autoDelete>
    </appender>

    <!-- 日志输出级别 -->
    <root level="ERROR">
        <appender-ref ref="RABBITMQ"/>
    </root>
</configuration>

Logstash

安装

以官方镜像运行容器,再把容器内配置拷贝到外面,删除容器。修改完配置,再run并挂载外部配置。

  • 拉取镜像sudo docker pull logstash:7.7.0
  • 运行容器sudo docker run --name logstash -d -p 5044:5044 -p 9600:9600 docker.elastic.co/logstash/logstash:7.7.0
  • 拷贝配置文件sudo docker cp logstash:/usr/share/logstash/config /home/ubuntu/logstash
  • 拷贝配置文件sudo docker cp logstash:/usr/share/logstash/pipeline /home/ubuntu/logstash
  • 停止并删除容器
  • 挂载并启动:
    • sudo docker run --name logstash \
      -p 5044:5044 -p 9600:9600 \
      --link elasticsearch:es \
      -v /home/ubuntu/logstash/config:/usr/share/logstash/config \
      -v /home/ubuntu/logstash/pipeline:/usr/share/logstash/pipeline \
      -d logstash:7.7.0
      

:books:配置文件

config目录下的每个文件都有一个特定的作用,以下是一些常见的文件及其功能:

  1. jvm.options: 这个文件包含了 Logstash JVM(Java虚拟机)的配置选项。你可以在这里配置Java虚拟机的堆大小、垃圾回收选项等。

  2. log4j2.properties: 这是 Logstash 使用的日志系统(log4j2)的配置文件。你可以在这里配置日志的输出目标、日志级别、日志格式等。

  3. logstash-sample.conf: 这个文件是一个示例的 Logstash 配置文件,用于演示如何配置 Logstash 来处理数据。可以删除

  4. logstash.yml: 这个文件包含 Logstash 的主要配置选项,如监听端口、数据目录、插件配置等。你可以在这里设置 Logstash 的全局配置。

  5. pipelines.yml: 这个文件用于配置 Logstash 的数据处理管道。你可以定义多个数据处理管道,每个管道可以有不同的输入、过滤和输出配置。这个文件允许你组织和管理 Logstash 的数据流。

  6. startup.options: 这个文件包含了 Logstash 启动时的选项和参数,例如 Logstash 运行的用户、运行模式等。

pipeline/logstash.conf配置

:rabbit:配置RabbitMQ、ES

input {
   rabbitmq{
        # rabbitMQ配置用host配置IP和端口,千万别用port,会导致连不上
        host=> "IP:PORT"
        vhost=> "test"
        user=> "账号"
        password=> "密码"
        exchange=> "app.log"
        key => "logstash"
        durable=> true
        codec=> json
   }
}
# 下方用到的字段是MQ消息json解析后的属性,对应的logstash发送日志得是json格式
filter {
    # 过滤掉空信息
    if ([message]== ""){
        drop {}
    }
    # 用于建立索引的字段必须转成小写,ES索引名必须小写
    mutate {
        lowercase => ["[service]", "[level]"]
    }

}
output {
    elasticsearch {
            hosts => [ "http://elasticsearch:9200"]
            # 按服务名、日志等级每天一个索引
            index => "logstash-%{[service]}-%{[level]}-%{+YYYY.MM.dd}"
    }
}

滚动日志

创建索引模板,给模板设置索引生命周期管理策略(ILM),logstash按照模板创建索引,按照ILM策略删除索引

索引模板

可以在kibana可视化界面中创建,也可以rest创建,如下:

PUT _template/logstash
{
  "index_patterns": ["logstash-*"],
  "settings": {
    //由于我是单节点,所以就1个分片,0副本
    "number_of_shards": 1,
    "number_of_replicas": 0
  },
  "mappings": {
    "properties": {
      "level": {
        "type": "keyword"
      },
      "service": {
        "type": "keyword"
      },
      "message": {
        "type": "text"
      }
    }
  }
}

ILM(Index Lifecycle Management)

可以在kibana可视化界面(推荐)创建,界面简单易懂。

rest创建一个索引年龄到达3分钟就进入删除(delete)状态的策略:

PUT _ilm/policy/logstash
{
  "policy": {
    "phases": {
      "hot": {
        "min_age": "0ms",
        "actions": {
          "set_priority": {
            "priority": 100
          }
        }
      },
      # 我这是为了测试,所以设置了3分钟后进入删除(delete)阶段
      # 到了删除阶段的索引不会马上被删除,ES有自己的策略,这里不赘述
      "delete": {
        # 3分钟仅用于测试,按实际情况修改,比如  30d
        "min_age": "3m",
        "actions": {
          "delete": {}
        }
      }
    }
  }
}

在kibana上把此策略配置给上述的模板,配置好之后,logstash创建的索引就会按此策略删除

相应的logstash.conf的output配置也需要改动:

output {
  elasticsearch {
    hosts => ["http://elasticsearch:9200"]
    # 按服务名、日志等级每天一个索引
    index => "logstash-%{[service]}-%{[level]}-%{+YYYY.MM.dd}"
    # 指定使用的索引模板
    template_name => "logstash"
  }
}

如此依赖即可达到滚动日志的效果

  • logstash会按照模板配置,每个应用每个等级每天生成一个索引
  • ILM会按照配置删除等管理索引
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容