ELK--收集日志demo

ELK--收集日志demo

之前项目多实例部署的时候,由于请求被负载到任意节点,所以查看日志是开多个终端窗口。后来做了简单处理,将同一项目的多实例日志存入同一个文件,由于存在文件锁的竞争,日志内容混乱,性能差且效果也不好。后来使用tail 命令仅在查看日志文件时汇总显示(后来改为multitail)。一直想试试ELK来着,简单做了下集成的demo。

安装ELK

这里简单提一下:

  • logstash:收集日志数据
  • elasticsearch:存取日志数据
  • kibana:数据展示
    这里使用docker compose安装,简单方便。为了方便服务调用,我直接关掉了elasticsearch的安全设置
yml 复制代码
# 定义网络
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日志

shell 复制代码
# 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配置

  1. 添加依赖
  2. 配置日志
xml 复制代码
<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中通过切换不同的命名空间进行快速的日志查询定位

相关推荐
SuperherRo41 分钟前
服务攻防-中间件安全&Apache&Tomcat&Jetty&Weblogic&AJP协议&反序列化&CVE漏洞
中间件·tomcat·apache·jetty·weblogic
空中海1 小时前
第四篇:进阶篇 — 缓存、消息队列、安全与常用中间件
安全·缓存·中间件
AI木马人2 小时前
16.【ELK日志系统实战】一次线上“定位失败”让我重构日志体系:如何在3分钟内定位AI系统问题?(完整可复现方案)
elk·重构
逍遥德1 天前
MQTT教程详解-03. 高级知识点
java·物联网·中间件·信息与通信·iot·iotdb
前端小超人rui1 天前
【Node.js Express中间件理解及中间件分类和作用】
中间件·node.js·express
前端小超人rui1 天前
封装Express 自定义中间件
中间件·node.js·express
weixin_419658311 天前
RabbitMQ 应用问题
java·分布式·中间件·rabbitmq
z小天才b1 天前
Django ORM、中间件与信号 — 完全指南
python·中间件·django
fuquxiaoguang1 天前
金蝶天燕AMDC:当企业级缓存遇见Redis 8.2,国产中间件的“性能+易用”双飞跃
redis·缓存·中间件
亚空间仓鼠1 天前
Kubernetes技术入门与实践(三):构建高效中间件服务
中间件·容器·kubernetes