前言
- 环境如下:
操作系统: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目录下的每个文件都有一个特定的作用,以下是一些常见的文件及其功能:
jvm.options
: 这个文件包含了 Logstash JVM(Java虚拟机)的配置选项。你可以在这里配置Java虚拟机的堆大小、垃圾回收选项等。log4j2.properties
: 这是 Logstash 使用的日志系统(log4j2)的配置文件。你可以在这里配置日志的输出目标、日志级别、日志格式等。logstash-sample.conf
: 这个文件是一个示例的 Logstash 配置文件,用于演示如何配置 Logstash 来处理数据。可以删除logstash.yml
: 这个文件包含 Logstash 的主要配置选项,如监听端口、数据目录、插件配置等。你可以在这里设置 Logstash 的全局配置。pipelines.yml
: 这个文件用于配置 Logstash 的数据处理管道。你可以定义多个数据处理管道,每个管道可以有不同的输入、过滤和输出配置。这个文件允许你组织和管理 Logstash 的数据流。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会按照配置删除等管理索引