ELK实现日志采集
本文使用Filebeat采集日志,将日志输出给Logstash并保存到Elasticsearch 中,通过Kibana可视化界面展示日志
一、Elasticsearch和Kibaba安装
作者使用docker一键安装部署Elasticsearch集群和kibana
docker和docker-compose安装脚本:
程序中resources/docker/目录下也有
Elasticsearch和Kibana安装脚本:
创建docker-compose文件
vim docker-compose.yml
version: '2.2'
services:
cerebro:
image: lmenezes/cerebro:0.8.3
container_name: cerebro
ports:
- "9000:9000"
command:
- -Dhosts.0.host=http://elasticsearch:9200
networks:
- es7net
kibana:
image: docker.elastic.co/kibana/kibana:7.4.2
container_name: kibana7
environment:
- I18N_LOCALE=zh-CN
- XPACK_GRAPH_ENABLED=true
- TIMELION_ENABLED=true
- XPACK_MONITORING_COLLECTION_ENABLED="true"
ports:
- "5601:5601"
networks:
- es7net
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:7.4.2
container_name: es7_01
environment:
- cluster.name=eslearn
- node.name=es7_01
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
- discovery.seed_hosts=es7_01,es7_02
- cluster.initial_master_nodes=es7_01,es7_02
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- es7data1:/usr/share/elasticsearch/data
ports:
- 9200:9200
networks:
- es7net
elasticsearch2:
image: docker.elastic.co/elasticsearch/elasticsearch:7.4.2
container_name: es7_02
environment:
- cluster.name=eslearn
- node.name=es7_02
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
- discovery.seed_hosts=es7_01,es7_02
- cluster.initial_master_nodes=es7_01,es7_02
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- es7data2:/usr/share/elasticsearch/data
networks:
- es7net
volumes:
es7data1:
driver: local
es7data2:
driver: local
networks:
es7net:
driver: bridge
启动和停止命令:
启动:
docker-compose up -d
停止:
docker-compose down
二、Logstash安装配置和启动
Logstash安装:
略
Logstash配置:
作者使用grok表达式来格式化程序 输出的日志。
cp logstash-sample.conf logstash.conf
vim logstash.conf
input {
beats {
port => "5044" ##指定监听端口
}
}
filter {
## 这里使用grok表达式
grok {
patterns_dir => ["./patterns"] ## 引用自定义的表达式配置文件,内容详见下面
match => { "message" => "%{DATE1:time1} %{LEVEL:level1} %{THREAD:thread1} %{JAVA_SOURCE:source1} - %{JAVALOGMESSAGE:doc}" }
}
## 移除掉某些字段
mutate{
remove_field => ["ecs","host","agent","@timestamp","@version","input","tags"]
}
}
output{
elasticsearch {
hosts => ['192.168.59.110:9200'] ##ES地址,集群使用逗号隔开
index => "elk-log" ##ES索引名称
}
}
文章中filter.grok 将grok表达式配置在外部,用文件保存,patterns内容:
DATE1 [0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{3}
LEVEL (INFO)|(DEBUG)|(ERROR)|(WARN)|(FATAL)
JAVA_SOURCE [a-zA-Z.<>():0-9]*
THREAD [\s\S]*
验证日志输出 是否匹配grok表达式
- 编写java程序,配置logback.xml日志输出格式
注:如果不想用程序,可以使用echo XXX >> 日志.log,日志格式下一步有
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%date %level [%thread] %logger{60} - %msg%n</pattern>
</encoder>
- 在Kibana开发工具中调试grok
日志样例输出格式:
2020-07-18 13:24:34,471 ERROR [http-nio-8080-exec-1] com.zhenglei.controller.TestControler - 55.3.244.1 GET /index.html 15824 9
Grok 模式:
%{DATE1:time1} %{LEVEL:level1} %{THREAD:thread1} %{JAVA_SOURCE:source1} - %{JAVALOGMESSAGE:doc}
自定义模式:
DATE1 [0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{3}
LEVEL (INFO)|(DEBUG)|(ERROR)|(WARN)|(FATAL)
JAVA_SOURCE [a-zA-Z.<>():0-9]*
THREAD [\s\S]*
最后点击“模拟”,输出结构化数据 如下图:
Logstash启动:
在logstash根目录下执行
nohup /bin/logstash -f /config/logstash.yml &
三、Filebeat安装配置和启动
Filebeat安装:
略
Filebeat配置:
在filebeat根目录创建filebeat-demo.yml文件:
filebeat.inputs:
- type: log
paths:
- /usr/local/elk/logs/*.log ##监听的日志目录
multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}' ##用于匹配多行的正则表达式
multiline.negate: true ## 是否匹配pattern的行合并到上一行
multiline.match: after ## 匹配pattern后,与前面(before)还是后面(after)的内容合并为一条日志
output.logstash:
hosts: ["127.0.0.1:5044"] ##输出到logstash地址,端口号和logstash配置中保持一致
Filebeat启动:
在filebeat根目录下执行
nohup ./filebeat -e -c filebeat-demo.yml &
四、查看ES日志
- 启动Logstash
- 启动Filebeat
- 启动日志输出程序(文章最后会给程序地址)
- 查看Kibana中的日志,如下图: