- 之前有写过一个方法(https://www.jianshu.com/p/17567e89733f),把日志输出到elk的配置嵌入在springboot服务代码里面,优点配置简单、易上手,缺点没能做到按springboot子项目名分索引,还考虑到会拉低服务运行效率,还是把配置剥离出来。
- 增加redis缓存,由相对轻量、占用资源少,但功能较少的filebeat代替logstash收集日志,由于filebeat不支持对数据预处理,因此使用filebeat+logstash组合使用 ,最终整个日志收集过程为:各节点filebeat收集日志传送到redis作缓冲,logstash过滤日志,存储到Elasticsearch,最后使用kibana查看。
环境介绍
主机 | 服务 |
---|---|
192.168.1.10 | elk + redis |
192.168.1.20 | springboot + filebeat |
多模块maven项目结构大概如下:
project #父工程
-project-1 #子工程(1)
-project-2 #子工程(2)
...
-project-n #子工程(n)
目录:
- 安装filebeat
- docker-compose安装redis
- docker-compose安装ELK
https://www.jianshu.com/p/2d78ce6bc504 - 访问kibana查看日志信息
安装filebeat
1、配置yum源
cat > /etc/yum.repos.d/filebeat.repo <<EOF
[filebeat]
name=Elasticsearch repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=0
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
EOF
2、执行安装
yum -y install filebeat
3、将配置文件 /etc/filebeat/filebeat.yml替换为以下内容 (删除一些注释内容;新增服务日志收集、输出到redis的配置)
#=========================== Filebeat inputs =============================
filebeat.inputs:
############################################## Springboot服务日志 ##########################################################
#=========== project-1 项目日志 ==============
- type: log
enabled: true
paths:
- /logs/project-1/project-1.log #指定Springboot项目日志文件的位置
multiline:
#pattern: '^\s*(\d{4}|\d{2})\-(\d{2}|[a-zA-Z]{3})\-(\d{2}|\d{4})' # 指定匹配的表达式(匹配例如以 1970-01-01 00:00:23:886 时间格式开头的字符串)
pattern: '^\[' # 匹配以“[”开头的字符串
#pattern: '^\[*ERROR' #以日志级别(INFO、DEBUG、ERROR)匹配的字符串
negate: true # 是否匹配到
match: after # 合并到上一行的末尾, 为了error日志
max_lines: 1000 # 最大的行数
timeout: 30s # 如果在规定的时候没有新的日志事件就不等待后面的日志
fields:
indexname: prod-project-1 #自定义字段;用于logstash,索引名
#=========== project-2 项目日志 ==============
- type: log
enabled: true
paths:
- /logs/project-2/project-2.log
multiline:
pattern: '^\['
negate: true
match: after
max_lines: 1000
timeout: 30s
fields:
indexname: prod-project-2 #自定义变量(indexname)
############################################## Springboot服务日志 ##########################################################
#============================= Filebeat modules ===============================
filebeat.config.modules:
path: ${path.config}/modules.d/*.yml
reload.enabled: false
#==================== Elasticsearch template setting ==========================
setup.template.settings:
index.number_of_shards: 3
#================================ Outputs =====================================
# Configure what output to use when sending the data collected by the beat.
##-------------------------- Redis output ------------------------------
output.redis:
hosts: ["192.168.1.10:6379"] #输出到redis,缓存
#password: "123456"
key: "filebeat:test" #redis中日志数据的key值ֵ
db: 0
timeout: 5
#================================ Processors =====================================
processors:
- add_host_metadata: ~
- add_cloud_metadata: ~
4、启动并设置filebeat服务开机自启动
systemctl start filebeat
^start^enable
docker-compose安装redis
version: "3.3"
services:
redis:
image: redis
container_name: elk_redis
network_mode: "bridge"
restart: always
environment:
- TZ=Asia/Shanghai
command: redis-server /usr/local/etc/redis/redis.conf
ports:
- "6379:6379"
volumes:
- /data/redis/data:/data
#- /data/redis/redis.conf:/usr/local/etc/redis/redis.conf #可以设置密码
#运行redis
docker-compose up -d
docker-compose安装ELK
1、配置ELK
- 基于文章(https://www.jianshu.com/p/2d78ce6bc504)安装好ELK
- 将logstash/logstash-springboot.conf文件替换为以下内容
input {
redis {
data_type =>"list"
key =>"filebeat:test"
host =>"192.168.1.10" #redis地址
port => 6379
#password => "123456"
threads => "8"
db => 0
#codec => json
}
}
filter {
#grok { #Logstash常用filter插件grok正则捕获(过滤字段)
# match => ["message", "%{TIMESTAMP_ISO8601:time}\s* \s*%{NOTSPACE:thread-id}\s* \s*%{LOGLEVEL:level}\s* \s*%{JAVACLASS:class}\s* \- \s*%{JAVALOGMESSAGE:logmessage}\s*"]
#}
# grok的语法规则是:
# %{语法:语义}
# “语法”指的是匹配的模式。例如使用NUMBER模式可以匹配出数字,IP模式则会匹配出127.0.0.1这样的IP地址。
#视自己实际情况删除字段,不在output中输出以下字段,节省空间;可全注释不作删除
mutate { #Logstash常用filter插件mutate(重命名、删除、替换字段等)
#remove_field => [
# "beat",
# "meta",
# "prospector"
#]
remove_field => [
"log",
"[host][os]",
"@version",
"logmessage",
"class",
"thread-id",
"[agent][ephemeral_id]",
"[agent][hostname]",
"[agent][id]",
"[agent][name]",
"[ecs][version]",
"[host][architecture]",
"[host][containerized]",
"[host][id]",
"[host][ip]",
"[host][mac]",
"[host][name]"
]
}
}
output {
elasticsearch {
hosts => ["192.168.1.10:9200"]
index => ["%{[fields][indexname]}-%{+YYYY-MM-dd}"]
#[fields][indexname] #调用filebeat服务fields配置中自定义变量(indexname)的值为索引;即无需if判断各个服务使用什么索引。
}
}
#output {
# if "prod-project-1" in [tags]{
# elasticsearch {
# hosts => ["192.168.1.10:9200"]
# index => "prod-project-1-%{+yyyy.MM.dd}"
# }
# }
#
# if "prod-project-2" in [tags]{
# elasticsearch {
# hosts => ["192.168.1.10:9200"]
# index => "prod-project-2-%{+yyyy.MM.dd}"
# }
# }
#
#}
2 、 logstash中安装json_lines插件并重启logstash
docker exec -it elk_logstash /bin/bash -c "cd /bin && logstash-plugin install logstash-codec-json_lines"
docker restart elk_logstash
访问kibana 查看日志信息
访问http://192.168.1.10:5601,创建各环境服务索引
-
调用filebeat服务fields配置中自定义变量(indexname)的值为索引
-
补充:索引模板(logstash)默认输出很多不必要的字段,可按需通过logstash/logstash-springboot.conf文件里fileter插件mutate删除字段。