引言
- 本次使用的ELK版本均为7.17.5,日志推送方式为logstash直推ES存储,适用与日志量中小规模,如有大日志量高并发场景可以自行集成kafka等消息中间件为缓冲
- 本次描述的为SpringBoot – logback集成logstash的使用方式,如使用其他日志框架或其他语言可自行集成使用logstash即可
一、环境准备
- 安装docker – 详见此博客中的第一步 – CentOS安装Docker – docker安装
- 注意: logstash的日志输出可能会占用大量磁盘空间,解决详见 – Docker容器日志占用空间过大问题及解决
二、docker安装elasticsearch kibana logstash
安装:
记得开放使用的端口,或者关闭防火墙
提示:需要提升虚拟机或者服务器的内存到8G以上
拉取镜像并安装
docker pull elasticsearch:7.17.5
docker pull kibana:7.17.5
docker pull logstash:7.17.5
为容器创建网络
docker network create es-net
查看网络是否创建成功
启动elasticsearch容器
- 众所周知,ES是个内存大杀器,此处我仅给它配置512M的内存空间,不够用的可自行修改
docker run -it -d \
--name es \
--restart=always \
-p 9200:9200 -p 9300:9300 \
-e "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms512m -Xmxm" \
-v es-data:/usr/share/elasticsearch/data \
-v es-plugins:/usr/share/elasticsearch/plugins \
--privileged \
--network es-net \
elasticsearch:7.17.5
- 访问9200端口成功得到响应说明es安装启动成功
启动kibana容器
docker run -it -d \
-p 5601:5601 \
--name kibana --restart=always \
-e ELASTICSEARCH_URL=http://127.0.0.1:9200 \
--network=es-net \
kibana:7.17.5
- 访问5601端口成功得到响应说明kibana安装启动成功
注意:
- 至此kibana和elasticsearch已经安装成功,可以正常使用,如果想让它变得好用可以将kibana汉化以及给ES设置密码、安装ik分词器 – 详见 ek安装使用
- 如果es中的索引库默认的生命周期不满足日志存储的需求,可自行设置生命周期加到索引模式上,如此即可实现日志到达设置的周期时间自动删除 – 详见 设置生命周期
启动logstash容器
- 创建logstash的配置文件 logstash.conf
mkdir -p /home/elk
cd /home/elk
vim logstash.conf
# 此处写入配置内容
:wq
- 内容如下
input {
tcp{
port => 5044
#输入为json据
codec => json_lines
}
}
filter {
ruby{
code => "event.set('timestamp', (event.get('@timestamp').time.localtime + 8*60*60).strftime('%Y-%m-%d %H:%M:%S'))"
}
ruby{
code => "event.set('@timestamp',event.get('timestamp'))"
}
mutate {
remove_field => ["timestamp"]
}
}
output {
stdout {
#这个是安装时详细打印配置,生产中注释掉
codec => rubydebug
# 设置日志级别
level => warn
}
elasticsearch {
hosts => ["elasticsearch:9200"] # elasticsearch也可设置成指定IP
index => "logstash-%{[server_name]}-%{+YYYY.MM.dd}"
}
}
- 启动logstash容器命令
docker run -d \
--name logstash \
--network es-net \
--privileged \
-p 5044:5044 -p 5047:5047 -p 9600:9600 \
-v /home/elk/logstash.conf:/usr/share/logstash/pipeline/logstash.conf \
-e TZ=Asia/Shanghai \
logstash:7.17.5
-
使用docker ps 命令查看当前正在运行的容器,若有以下三个容器正常运行即表示ELK部署完成
注意: -
如果有容器没有启动成功,使用docker ps -a 查看到未启动成功的容器并复制id
-
使用docker logs 容器id 命令查看日志查看启动失败原因
-
logstash启动失败的绝大多数原因是配置文件格式不正确,启动时就会报异常
-
logstash启动成功后客户端推送日志不报错但ES中未存储日志的多为es地址配置错误(此时需要注重容器之间的网络通信是否互通,测试方法:可直接进入logstash容器使用curl命令尝试访问配置的地址,配置的网址址访问成功才表示容器之间网络互通)
至此,ELK的安装部署已经完成
三、SpringBoot中logback集成logstash向es推送日志
首先在POM文件中引入如下logback集成logstash的依赖
<!-- 向logstash推送日志数据-->
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>6.3</version>
</dependency>
然后在logback的配置文件中添加如下内容
-
配置文件位置
-
配置文件内容
<!--logback输出到logstash-->
<appender name="STASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destination>lostash容器所在的服务器IP:5044</destination>
<encoder class="net.logstash.logback.encoder.LogstashEncoder">
<!--打印行号、方法名,官方不建议在生产环境开启此配置,默认为fa1s(关闭),具网友测试开启后的耗时是未开启的大约360倍的时间(业务量小的 -->
<includeCallerData>true</includeCallerData>
<!-- 设置时区 -->
<timeZone>UTC</timeZone>
<!--日期格式化-->
<!--<timestampPattern>yyyy-MM-dd'T'HH:mm:ss.SSS</timestampPattern>-->
<!-- 添加自定义属性,这里的server_name.是服务名-->
<customFields>{"server_name":"server-bcd"}</customFields>
</encoder>
<!-- 此日志文件只记录error级别的 -->
<!--<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>error</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>-->
</appender>
<!--记录到文件时,记录两类一类是error日志,一个是所有日志-->
<root level="info">
<appender-ref ref="STDOUT"/>
<appender-ref ref="STASH"/>
</root>
以下是日志推送测试
- 日志推送测试代码
open fun test() {
for (i in 1..10) {
log.error("测试日志推送>>>>>>>>>>>>>>>>>>>>>>>>>>>>")
}
}
- 在Kibana中查看日志
-
- 创建索引模式匹配到自己需要查询的日志索引库
- 创建索引模式匹配到自己需要查询的日志索引库
-
- 查看日志
注意:
- 查看日志
- 此时查看到的日志的时间格式有些不符合浏览习惯可改至YYYY-MM-DD HH:mm:ss.SSS
至此已使用ELK完成了分布式日志管理系统的部署搭建及集成使用