ELK--收集日志demo
之前项目多实例部署的时候,由于请求被负载到任意节点,所以查看日志是开多个终端窗口。后来做了简单处理,将同一项目的多实例日志存入同一个文件,由于存在文件锁的竞争,日志内容混乱,性能差且效果也不好。后来使用tail 命令仅在查看日志文件时汇总显示(后来改为multitail)。一直想试试ELK来着,简单做了下集成的demo。
安装ELK
这里简单提一下:
- logstash:收集日志数据
- elasticsearch:存取日志数据
- kibana:数据展示
这里使用docker compose安装,简单方便。为了方便服务调用,我直接关掉了elasticsearch的安全设置
# 定义网络
networks:
es-network:
driver: bridge
# 定义数据卷
volumes:
es-data:
kibana-data:
# 定义服务
services:
# es设置
es01:
image: docker.elastic.co/elasticsearch/elasticsearch:8.15.2
container_name: es01
logging:
driver: json-file
ports:
- "9200:9200"
networks:
- es-network
volumes:
- es-data:/usr/share/elasticsearch
environment:
- ELASTIC_PASSWORD=thisIsPWD # 自定义密码
- xpack.security.enabled=false # 禁用安全设置
deploy:
resources:
limits:
memory: 1GB
kibana:
image: docker.elastic.co/kibana/kibana:8.15.2
container_name: kibana01
logging:
driver: json-file
ports:
- "5601:5601"
networks:
- es-network
volumes:
- kibana-data:/usr/share/kibana
depends_on:
- es01
environment:
- ELASTICSEARCH_HOSTS=http://es01:9200 # es host
- ELASTICSEARCH_BASIC_AUTH_USER=elastic
- ELASTICSEARCH_BASIC_AUTH_PASSWORD=thisIsPWD # 密码
logstash:
image: docker.elastic.co/logstash/logstash:8.15.2
container_name: logstash
networks:
- es-network
ports:
- "5044:5044"
volumes:
- /Users/mars/docker_data/logstash/logstash.yml:/usr/share/logstash/config/logstash.yml
- /Users/mars/docker_data/logstash/pipeline/:/usr/share/logstash/pipeline/ #挂载管道配置
depends_on:
- es01
日志收集配置
compose配置文件中,logstash挂载了外部配置文件夹。
不用来源的数据可以单独定义一个管道配置来收集和处理日志数据。这里定义了两个测试用例,一个用来收集docker日志,一个用来收集Springboot日志
# docker-log.conf
input {
file {
path => "/var/lib/docker/containers/*/*.log"
start_position => "end"
sincedb_path => "/dev/null"
}
}
output {
elasticsearch {
hosts => ["http://es01:9200"]
index => "docker-logs-%{+YYYY.MM.dd}"
}
}
# springboot-log.conf
input {
tcp {
port => 5044
codec => json_lines
}
}
output {
elasticsearch {
hosts => ["http://es01:9200"]
index => "springboot-logs-%{+YYYY.MM.dd}"
}
}
启动容器
docker compose up -d
,容器启动成功后,浏览器访问kibana主页,在discovery中添加新的data view,此时能看到logstash配置的两个管道中的索引模式:
- docker-logs-%{+YYYY.MM.dd}
- springboot-logs-%{+YYYY.MM.dd}
分别创建对应的data view即可。
springboot配置
- 添加依赖
- 配置日志
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>8.0</version>
</dependency>
<!-- 日志配置-->
<configuration>
<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destination>localhost:5044</destination><!-- logstash监听端口-->
<encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
<providers>
<timestamp />
<logger />
<threadName />
<level />
<message />
<logstashMarkers />
<arguments />
<stackTrace />
</providers>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="LOGSTASH" />
</root>
</configuration>
测试
Springboot中调用接口,kibana中通过切换不同的命名空间进行快速的日志查询定位