ELK是Elasticsearch、Logstash、Kibana的简称,这三者是核心套件,但并非全部。
Elasticsearch是实时全文搜索和分析引擎,提供搜集、分析、存储数据三大功能;是一套开放REST和JAVA API等结构提供高效搜索功能,可扩展的分布式系统。它构建于Apache Lucene搜索引擎库之上。
Logstash是一个用来搜集、分析、过滤日志的工具。它支持几乎任何类型的日志,包括系统日志、错误日志和自定义应用程序日志。它可以从许多来源接收日志,这些来源包括 syslog、消息传递(例如 RabbitMQ)和JMX,它能够以多种方式输出数据,包括电子邮件、websockets和Elasticsearch。
Kibana是一个基于Web的图形界面,用于搜索、分析和可视化存储在 Elasticsearch指标中的日志数据。它利用Elasticsearch的REST接口来检索数据,不仅允许用户创建他们自己的数据的定制仪表板视图,还允许他们以特殊的方式查询和过滤数据
此处先下载docker,下载安装的方法此处略。
window系统:输入powershell,进入到命令窗口。
1.下载相关镜像
docker pull elasticsearch:7.6.0
docker pull kibana:7.6.0
docker pull logstash:7.6.0
2.启动docker-compose
2.1 配置docker-compose.yml
version: '3'
services:
elasticsearch:
image: elasticsearch:7.6.2
container_name: elasticsearch
user: root
environment:
- "cluster.name=elasticsearch" #设置集群名称为elasticsearch
- "discovery.type=single-node" #以单一节点模式启动
- "ES_JAVA_OPTS=-Xms512m -Xmx512m" #设置使用jvm内存大小
volumes:
- E://docker/images/mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins #插件文件挂载
- E://docker/images/mydata/elasticsearch/data:/usr/share/elasticsearch/data #数据文件挂载
ports:
- 9200:9200
- 9300:9300
logstash:
image: logstash:7.6.2
container_name: logstash
environment:
- TZ=Asia/Shanghai
volumes:
- E://docker/images/mydata/logstash/logstash-springboot.conf:/usr/share/logstash/pipeline/logstash.conf #挂载logstash的配置文件
- E://docker/images/mydata/logstash/mysql-connector-java-8.0.18.jar:/usr/share/logstash/mysql-connector-java-8.0.18.jar #如果通过mysql数据库进行日志传输的话,需要挂载一个mysql驱动(根据自己实际情况进行挂载)
depends_on:
- elasticsearch #kibana在elasticsearch启动之后再启动
links:
- elasticsearch:es #可以用es这个域名访问elasticsearch服务
ports:
#此处我通过UDP和TCP的方式传输日志,因此映射了2个端口号
- 4560:4560
- 4561:4561/udp
kibana:
image: kibana:7.6.2
container_name: kibana
links:
- elasticsearch:es #可以用es这个域名访问elasticsearch服务
depends_on:
- elasticsearch #kibana在elasticsearch启动之后再启动
environment:
- "elasticsearch.hosts=http://es:9200" #设置访问elasticsearch的地址
ports:
- 5601:5601
2.2 配置logstash-springboot.yml
input {
#TCP的方式传输日志
tcp {
host => "0.0.0.0"
port => 4560
type => "tcp"
mode => "server"
codec => json_lines
}
#UDP的方式传输日志
udp {
host => "0.0.0.0"
port => 4561
type => "udp"
codec => json_lines
}
#Mysql的方式传输日志
jdbc {
#数据库配置
jdbc_driver_library => "/usr/share/logstash/mysql-connector-java-8.0.18.jar"
jdbc_driver_class => "com.mysql.cj.jdbc.Driver"
jdbc_connection_string => "jdbc:mysql://cdb-ksj76j8k.cd.tencentcdb.com:10051/logs?autoReconnect=true&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&characterEncoding=utf8&useSSL=false&serverTimezone=UTC"
jdbc_user => "root"
jdbc_password => "qwe123!@#"
jdbc_default_timezone => "Asia/Shanghai"
#多久同步一次,默认10秒
schedule => "* * * * *"
statement => "SELECT * FROM logging_event WHERE event_id > :sql_last_value order by timestmp asc"
#是否需要追踪字段
record_last_run => true
use_column_value => true
tracking_column => "event_id"
#这里可以手动设置:sql_last_value的值,默认时间是1970-01-01,默认数字是0
last_run_metadata_path => "/usr/share/logstash/mall-tiny-info"
#是否清除last_run_metadata_path的记录,如果是真那么每次都相当于从头开始查询所有数据库记录
clean_run => false
type => "jdbc"
#是否分页
jdbc_paging_enabled => "true"
jdbc_page_size => "10000"
}
}
output {
stdout {
codec => json_lines
}
if [type] == "jdbc" {
elasticsearch {
hosts => "es:9200"
index => "mall-tiny-jdbc-%{+YYYY.MM.dd}"
}
}
if [type] == "udp" {
elasticsearch {
hosts => "es:9200"
index => "mall-tiny-udp-%{+YYYY.MM.dd}"
}
}
if [type] == "tcp" {
elasticsearch {
hosts => "es:9200"
index => "mall-tiny-tcp-%{+YYYY.MM.dd}"
}
}
}
将相关路径和配置信息填写好之后,打开powershell命令窗口,进入到docker-compose.yml所在的路径下,运行
docker-compose up -d
2.3 项目中配置logback-spring.xml
需要在项目中引用以下jar包,此处提供了三种方式传输日志,包含Mysql,Tcp,Udp
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>6.4</version>
</dependency>
2.3.1 Mysql方式
<appender name="DB" class="ch.qos.logback.classic.db.DBAppender">
<!-- 日志异步到数据库 -->
<connectionSource class="ch.qos.logback.core.db.DriverManagerConnectionSource">
<driverClass>com.mysql.jdbc.Driver</driverClass>
<url>数据库URL地址</url>
<user>数据库USER</user>
<password>数据库密码</password>
</connectionSource>
<!-- 这里设置日志级别为error -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>error</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<root level="INFO">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="DB"/>
</root>
2.3.2 Tcp方式
<appender name="TCP" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<!--可以访问的logstash日志收集端口-->
<destination>localhost:4560</destination>
<encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
<providers>
<timestamp>
<timeZone>UTC</timeZone>
</timestamp>
<pattern>
<pattern>
{
"severity": "%level",
"service": "${springAppName:-}",
"trace": "%X{X-B3-TraceId:-}",
"span": "%X{X-B3-SpanId:-}",
"exportable": "%X{X-Span-Export:-}",
"pid": "${PID:-}",
"thread": "%thread",
"class": "%logger{40}",
"rest": "%message"
}
</pattern>
</pattern>
</providers>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="TCP"/>
</root>
2.3.3 UDP方式
<appender name="UDP" class="net.logstash.logback.appender.LogstashUdpSocketAppender">
<!--可以访问的logstash日志收集端口-->
<host>localhost</host>
<port>4561</port>
<layout class="net.logstash.logback.layout.LogstashLayout" />
</appender>
<root level="INFO">
<appender-ref ref="CONSOLE" />
<appender-ref ref="UDP" />
</root>
2.4 使用kibana
进入到你已启动的kibana系统,首先添加你的index pattern。
2.5 总结
以上便是使用docker-compose部署使用ELK的大致流程,省去了部分相对简单的部分,如有疑问可留言或私信