直入主题
docker-comose搭建elk
-
创建相关目录
总的结构图如下
-
docker-compose.yml
version: '2' services: elasticsearch: image: elasticsearch:7.6.2 container_name: elasticsearch privileged: true user: root environment: - cluster.name=elasticsearch #以单一节点模式启动 - discovery.type=single-node #设置使用jvm内存大小 - ES_JAVA_OPTS=-Xms512m -Xmx512m volumes: - $PWD/elk/elasticsearch/plugins:/usr/share/elasticsearch/plugins - $PWD/elk/elasticsearch/data:/usr/share/elasticsearch/data ports: - 9200:9200 - 9300:9300 logstash: image: logstash:7.6.2 container_name: logstash ports: - 4560:4560 privileged: true environment: - TZ=Asia/Shanghai volumes: #挂载配置文件方便修改 - $PWD/elk/logstash/logstash.conf:/usr/share/logstash/pipeline/logstash.conf depends_on: - elasticsearch links: - elasticsearch:es kibana: image: kibana:7.6.2 container_name: kibana ports: - 5601:5601 privileged: true links: - elasticsearch:es depends_on: - elasticsearch environment: - elasticsearch.hosts=http://es:9200
-
logstash.conf
按照需求自定义,结合项目考虑索引。input { tcp { mode => "server" host => "0.0.0.0" port => 4560 codec => json } } output { elasticsearch { hosts => "es:9200" index => "logstash-%{+YYYY.MM.dd}" } }
-
ES下的data文件夹赋予权限,不然启动会报错.
chmod 777 ./elasticsearch/data
-
ik分词器插件下载,注意版本对应。
放入ik文件夹下并解压unzip ./elasticsearch-analysis-ik-7.6.2.zip
-
启动并查看日志确认无报错,页面可访问
docker-compose up -d
ES:
Kibana:
LogSatsh:
-
验证ik分词器
standard
:默认分词,单词会被拆分,大小会转换为小写
ik_smart
:最粗粒度的拆分,适合 适合 Phrase 查询
ik_max_word
:最细粒度的拆分,适合 Term Query
-
logstash安装json_lines插件
# 进入logstash容器
docker exec -it logstash /bin/bash
# 进入bin目录
cd /bin/
# 安装插件
logstash-plugin install logstash-codec-json_lines
# 退出容器
exit
# 重启
docker restart logstash
至此,基础环境搭建完成。
项目集成
添加相关依赖
<!--集成logstash-->
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
</dependency>
配置logback实现
按照自己需求配置,可以配置过滤级别之类的
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration>
<configuration>
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
<include resource="org/springframework/boot/logging/logback/console-appender.xml"/>
<property name="APP_NAME" value="elk-test"/>
<contextName>${APP_NAME}</contextName>
<!--输出到logstash的appender-->
<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<!--可以访问的logstash日志收集端口-->
<destination>192.168.1.110:4560</destination>
<encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder"/>
</appender>
<root level="INFO">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="LOGSTASH"/>
</root>
</configuration>
添加日志启动并测试:
-
自定义打印“项目启动成功!“
可以看到控制台的十条INFO记录
-
kibana创建相关索引
查看相关日志无误,日志条数正确。
多项目接入
虽然ELK是分布式日志解决方案,但是存在不少企业为了方便统一管理日志,多个单体程序向同一个ELK服务发送日志消息的情况。针对这种情况,本文提供一种较为简单的不成熟解决方案:程序标识
简单来说,就是日志添加相应字段,根据日志中的标识字段进行条件判断,将日志分别发送到不同的索引。
-
修改 logstash 的配置文件
input { # 略 } output { if [app] == "A" { elasticsearch { hosts => ["es:9200"] index => "a-index-%{+YYYY.MM.dd}" } } else if [app] == "B" { elasticsearch { hosts => ["es:9200"] index => "b-index-%{+YYYY.MM.dd}" } } }
-
日志配置xml文件配置
<customFields>
添加标识字段<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender"> <!--可以访问的logstash日志收集端口--> <destination>192.168.1.110:4560</destination> <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder"> <!-- 自定义程序标识 --> <customFields>{"app":"A"}</customFields> </encoder> </appender>
<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender"> <!--可以访问的logstash日志收集端口--> <destination>192.168.1.110:4560</destination> <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder"> <!-- 自定义程序标识 --> <customFields>{"app":"B"}</customFields> </encoder> </appender>
-
启动两个程序并查看成果数据
- es索引查看
- Kinaba索引创建
- Kinaba视图查看
- es索引查看
小结
需要注意logstash.conf的配置要考虑好,可以考虑让它可以分场景收集不同的日志。同样的logback-spring.xml中要有相关体现。
另外补充下logstash
各配置模块中index
的含义:
-
input模块的index参数:
在input模块中,index参数用于指定要从哪个索引(index)中获取数据。索引在Elasticsearch中是用于组织和存储数据的逻辑容器。当配置Logstash的输入时,可以指定一个或多个索引作为输入源,以便从中获取数据。例如,可以指定一个索引名称,如index => “my_index”,Logstash将从该索引中读取数据并进行处理。 本文使用tcp模式作为数据源。 -
output模块的index参数:
在output模块中,index参数用于指定要将数据发送到哪个索引(index)。当配置Logstash的输出时,可以指定要将数据发送到的特定索引。例如,可以使用index => "my_output_index"来指定要将处理后的数据发送到名为"my_output_index"的索引中。