ELK 的搭建和使用
ELK 介绍
ELK 是什么
E:elasticsearch
L:Logstach
K: Kibana
ELK 能帮我们做些什么
- 将程序的运行日志输出到 Logstach 中,Logstach 输出至 ES,随后在 Kibana 中检索日志
- 查看程序在某个时间段运行日志
- 分析日志,判断程序运行状态
ELK 主要运用于一些长久化的平台, 因为程序 持续集成,持续部署 查看运行日志较为繁琐。 运用 ELK 能更方便的定位程序在运行过程中 程序所打印的日志,在 Kibana 中 可直接搜索某一日志关键词 如:用户id:1221221,或是模糊查询:29900*。
搭建
本文采用docker-compose 搭建 ELK 日志可视化
搭建之前需要有docker 和 docker-compose 的环境
开始搭建
docker-compose
version: '3'
services:
elasticsearch:
image: elasticsearch:7.8.0
container_name: elasticsearch
environment:
- "cluster.name=elasticsearch" #设置集群名称为elasticsearch
- "ELASTIC_USERNAME=aodi"
- "ELASTIC_PASSWORD=aodi206"
- "discovery.type=single-node" #以单一节点模式启动
- "ES_JAVA_OPTS=-Xms1G -Xmx1G" #设置使用jvm内存大
- "xpack.security.transport.ssl.enabled=true"
- "xpack.security.enabled=true" # start es password
- TZ=Asia/Shanghai
volumes:
- ./elasticsearch/plugins:/usr/share/elasticsearch/plugins #插件文件挂载
- ./elasticsearch/data:/usr/share/elasticsearch/data #数据文件挂载
ports:
- 9200:9200
kibana:
image: kibana:7.8.0
container_name: kibana
links:
- elasticsearch:es #可以用es这个域名访问elasticsearch服务
depends_on:
- elasticsearch #kibana在elasticsearch启动之后再启动
environment:
- "elasticsearch.hosts=http://elasticsearch:9200" #设置访问elasticsearch的地址
- TZ=Asia/Shanghai
volumes:
- ./kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml
ports:
- 5601:5601
logstash:
image: logstash:7.8.0
container_name: logstash
volumes:
- ./logstash/pipeline/logstash.conf:/usr/share/logstash/pipeline/logstash.conf #挂载logstash的配置文件
environment:
- TZ=Asia/Shanghai #环境设置时区
depends_on:
- elasticsearch #kibana在elasticsearch启动之后再启动
links:
- elasticsearch:es #可以用es这个域名访问elasticsearch服务
ports:
- 4560:4560
kibana 配置文件
---
## Default Kibana configuration from Kibana base image.
## https://github.com/elastic/kibana/blob/master/src/dev/build/tasks/os_packages/docker_generator/templates/kibana_yml.template.ts
#
server.name: kibana
server.host: 0.0.0.0
elasticsearch.hosts: [ "http://elasticsearch:9200" ]
monitoring.ui.container.elasticsearch.enabled: true
## X-Pack security credentials
#
elasticsearch.username: elastic
elasticsearch.password: xxxxxx
logstash 配置文件
input {
tcp {
mode => "server"
host => "0.0.0.0"
port => 4560
codec => json_lines
}
}
output {
elasticsearch {
hosts => "es:9200"
user => "elastic"
password => "xxxxxx"
index => "ms-%{+YYYY.MM.dd}"
}
}
配置及其挂载完成后,docker-compose up -d 启动
在浏览器中输入 IP + 默认端口 5601,访问kibana
注意:
在此过程中,如果你配置了账户和密码,然而在登录的时候却没有让你输入用户名和密码,要从以下方式进行排查
- 检查 docker 挂载目录是否具有可读可写权限
- 检查 elasticsearch 是否启动成功
- 检查 elasticsearch、logstash 端口是否放开
如果以上都正常,那暂时就只有一个办法了。
- 进入 elasticsearch 容器内 ,
docker exec -it 容器名称 /bin/bash - 进入 bin 目录,找到 elasticsearch-setup-passwords
- ./elasticsearch-setup-passwords 执行命令,按照提示设置密码,建议将所有密码都设为同一密码
- 设置完毕后重启 elasticsearch
配置 Java 程序输出
使用 logback 输出日志 至 logstash
所需 maven 坐标
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-access</artifactId>
</dependency>
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>6.4</version>
</dependency>
logback 配置文件
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<springProperty name="springApplicationName" source="spring.application.name" defaultValue="aodi"/>
<springProperty name="FILENAME" source="management.endpoint.logfile.external-file" defaultValue="/tmp/iot/info.log"/>
<springProperty name="LOGSTASHHOST" source="management.endpoint.logstash-host" defaultValue="IP地址"/>
<springProperty name="FILEMAXHISTORY" source="logging.file.max-history" defaultValue="7"/>
<springProperty name="PATTERNFILE" source="logging.pattern.file" defaultValue="%-12(%d{HH:mm:ss}) %c{0}[%L] %msg%n"/>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${PATTERNFILE}</pattern>
</encoder>
</appender>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${FILENAME}</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${FILENAME}.%d{yyyy-MM-dd}</fileNamePattern>
<MaxHistory>${FILEMAXHISTORY}</MaxHistory>
</rollingPolicy>
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>${PATTERNFILE}</pattern>
</layout>
</appender>
<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destination>${LOGSTASHHOST}:4560</destination>
<encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder">
<includeContext>false</includeContext>
<customFields>{"appname": "${springApplicationName}"}</customFields>
</encoder>
</appender>
<!-- 本地环境 -->
<springProfile name="local">
<logger name="com.aodi" level="debug" />
<logger name="org.springframework.cloud.netflix.zuul" level="debug" />
<logger name="org.springframework.jdbc.core.JdbcTemplate" level="debug" />
<root level="info">
<root level="info">
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE" />
<appender-ref ref="LOGSTASH" />
</root>
</root>
</springProfile>
<!-- 开发测试环境 -->
<springProfile name="dev">
<logger name="com.aodi" level="debug" />
<logger name="org.springframework.cloud.netflix.zuul" level="debug" />
<logger name="org.springframework.jdbc.core.JdbcTemplate" level="debug" />
<root level="info">
<!-- <appender-ref ref="LOGSTASH" />-->
<!-- <appender-ref ref="CONSOLE" />-->
<!-- <appender-ref ref="FILE" />-->
</root>
</springProfile>
<!-- 生产环境 -->
<springProfile name="prod">
<logger name="com.aodi" level="info" />
<root level="info">
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE" />
<appender-ref ref="LOGSTASH" />
</root>
</springProfile>
</configuration>
使用
启动服务,将日志输出到 logback 中,登录 kibana
随后创建索引 一定要在有日志的情况下才能创建索引,在 discover 页面中,选择上方 open 打开 Manage searches
按需创建自己的索引,根据数据创建
随后切换到,discover 就可以选择索引搜索了
在左侧菜单的 management中可选择, Dev Tools 这个菜单可使用 KQL 进行搜索
那么好,本期就到这里,真的不是我水文章哦,有不懂的地方,欢迎给我留言。写的不好的地方欢迎批评指正