ELK--收集日志demo
- 安装ELK
- 日志收集配置
- 启动容器
- springboot配置
- 测试
之前项目多实例部署的时候,由于请求被负载到任意节点,所以查看日志是开多个终端窗口。后来做了简单处理,将同一项目的多实例日志存入同一个文件,由于存在文件锁的竞争,日志内容混乱,性能差且效果也不好。后来使用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.2container_name: es01logging:driver: json-fileports:- "9200:9200"networks:- es-networkvolumes:- es-data:/usr/share/elasticsearchenvironment:- ELASTIC_PASSWORD=thisIsPWD # 自定义密码- xpack.security.enabled=false # 禁用安全设置deploy:resources:limits:memory: 1GBkibana:image: docker.elastic.co/kibana/kibana:8.15.2container_name: kibana01logging:driver: json-fileports:- "5601:5601"networks:- es-networkvolumes:- kibana-data:/usr/share/kibanadepends_on:- es01environment:- 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.2container_name: logstashnetworks:- es-networkports:- "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 => 5044codec => 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中通过切换不同的命名空间进行快速的日志查询定位