简单流程:Filebeat 会定时监听事先指定的日志文件,如果日志文件有变化,会将数据推送至 Logstash,Logstash通过配置进行过滤筛选存入es,最终通过 Kibana 将数据呈现出来。
一. 环境准备准备服务器:目前使用linux centos搭建docker(docker环境搭建可查阅相关教程)二.自定义网络:保证同一网络下的容器 (ElasticSearch、Logstash、Kibana)相互访问
- 创建自定义网络elk
docker network create elk
- 查看已有网络(Docker自带3种网络模式 bridge、host、none)
docker network ls三. ELFK部署 - ElasticSerach+ik分词器 部署
- 创建目录并设置目录777权限
mkdir -p /opt/elasticsearch/{config,data}
chmod 777 /opt/elasticsearch/{config,data}
- 拉取镜像
ElasticSearch7以上版本需要JDK11支持,但是我们系统安装的是JDK8(请自行匹配es版本)
docker pull elasticsearch:7.14.1
- 配置文件
vi /opt/elasticsearch/config/elasticsearch.yml
- 配置信息
# 允许通过本机所有IP访问 http.host: 0.0.0.0 # 是否支持跨域,默认为false http.cors.enabled: true http.cors.allow-origin: "*" # elasticsearch 7版本以上的默认只允许1000个分片,可能会报分片不足的问题 cluster.max_shards_per_node: 10000
- 创建和启动容器
docker run -d --name elasticsearch --net elk --restart always -p 9200:9200 -p 9300:9300 -e "ES_JAVA_OPTS=-Xms3g -Xmx3g" -e "discovery.type=single-node" -v /opt/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /opt/elasticsearch/data:/usr/share/elasticsearch/data elasticsearch:7.14.1
JVM堆内存大小建议设置大一点,不然可能会报错,建议堆内存设置至少 256M以上。
- 安装IK分词器
复制对应es版本的ik分词器完整下载地址—下载链接
- 容器下载安装
docker exec -it elasticsearch /bin/sh cd bin/ elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.14.1/elasticsearch-analysis-ik-7.14.1.zip
- 查看已安装的IK分词器
elasticsearch-plugin list
- 重启es生效
docker restart elasticsearch- Kibana部署
- 拉取对应es版本的kibana镜像
docker pull kibana:7.14.1
- 创建和启动容器
docker run -d --name kibana --net elk --restart always -p 5601:5601 -e "I18N_LOCALE=zh-CN" kibana:7.14.1
-e 汉化启动 -p 指定端口号
- 访问 http://ip:5601,显示kibana界面
- 拉取对应es版本的Logstash镜像
docker pull logstash:7.14.1
- 创建目录并设置目录777权限
mkdir -p /opt/logstash/{config,data,pipeline}
chmod 777 /opt/logstash/{config,data,pipeline}
- 配置文件(设置JVM堆内存大小)
vi /opt/logstash/config/jvm.options
-Xmx128m -Xms128m
- Logstash配置
vi /opt/logstash/config/logstash.yml
# 允许通过本机所有IP访问 http.host: "0.0.0.0" # 指定使用管道ID xpack.management.pipeline.id: ["main"]
- 管道ID和配置文件路径映射
vi /opt/logstash/config/pipelines.yml
添加管道ID和管道配置文件目录映射,注意符号 - 前后都要有空格(巨坑)
- pipeline.id: main path.config: "/usr/share/logstash/pipeline"
- 管道配置
vi /opt/logstash/pipeline/logstash-log.conf
input {
beats {
port => 5044
client_inactivity_timeout => 36000
}
}
filter {
grok {
match =>{
"message"=>"(?({.*}))"
}
}
grok {
match =>{
"message"=>"%{TIMESTAMP_ISO8601:logTime}"
}
}
grok {
match =>{
"message"=>"%{LOGLEVEL:logLevel}"
}
}
grok {
match => {
"message"=>"(?(?<="userId":)(d+))"
}
}
# 设置东八区时间
ruby {
code => "event.set('logstashTime', event.get('@timestamp').time.localtime + 8*60*60);
event.set('@timestamp', event.get('logstashTime'))"
}
mutate {
remove_field => ["@version"]
remove_field => ["tags"]
}
}
output {
if [appname] == "admin-server" {
elasticsearch {
hosts => ["http://es-ip:9200"]
index => "saas-admin-log"
}
}else if [appname] == "auth-server" {
elasticsearch {
hosts => ["http://es-ip:9200"]
index => "saas-auth-log"
}
}else if [appname] == "biz-server" {
elasticsearch {
hosts => ["http://es-ip:9200"]
index => "saas-biz-log"
}
}
stdout { codec => rubydebug }
}
可以看到在 output 里根据 appname 生成的不同索引库,其中 appname 是 filebeat 自定义字段,目的区分多应用日志,自定义字段在 Filebeat部署的时候定义(es-ip:es部署服务的ip地址或域名)。
- 创建和启动容器
docker run -d --name logstash --net elk --restart always -p 5044:5044 -p 9600:9600 -v /opt/logstash/config:/usr/share/logstash/config -v /opt/logstash/data:/usr/share/logstash/data -v /opt/logstash/pipeline:/usr/share/logstash/pipeline logstash:7.14.1- Filebeat 部署
- 拉取对应es版本的Filebeat镜像
docker pull elastic/filebeat:7.14.1
- 创建目录并设置目录777权限
mkdir -p /opt/filebeat/config chmod 777 /opt/filebeat/config
- 配置文件
vi /opt/filebeat/config/filebeat.yml
filebeat.inputs:
- type: log
enabled: true
paths:
- /logs/admin-server/log.log
fields:
appname: admin-server # 自定义字段,提供给 Logstash 用于区分日志来源
fields_under_root: true # 开启自定义字段
- type: log
enabled: true
paths:
- /logs/auth-server/log.log
fields:
appname: auth-server
fields_under_root: true
- type: log
enabled: true
paths:
- /logs/biz-server/log.log
fields:
appname: biz-server
fields_under_root: true
processors:
- drop_fields:
fields: ["log","input","host","agent","ecs"] # 过滤不需要的字段
output.logstash:
hosts: ['ipxxxx:5044']
/logs/admin-server/log.log 是应用 admin服务 输出的日志文件路径
ipxxxx 是部署 Logstash 服务器的IP地址
- 容器创建和启动
docker run -d --name filebeat --restart=always --log-driver json-file --log-opt max-size=100m --log-opt max-file=2 -v /logs:/logs -v /opt/filebeat/config/filebeat.yml:/usr/share/filebeat/filebeat.yml elastic/filebeat:7.14.1四. SpringBoot部署日志 - 配置日志模块
在SpringBoot项目日志公共模块中加入如下日志配置
logback DEBUG ${CONSOLE_LOG_PATTERN} UTF-8 ${LOG_HOME}/log.log %d{yyyy-MM-dd HH:mm:ss.SSS} -%5level ---[%15.15thread] %-40.40logger{39} : %msg%n%n UTF-8 ${LOG_HOME}/%d{yyyy-MM-dd}.%i.log 100MB 15 INFO ACCEPT DENY
项目本地启动,接口添加log打印(log.info(xxxx);)项目日志,会在本地根目录生成日志文件夹
然后将项目发布到线上,因为项目使用idea集成docker远程部署(可以查询相关资料进行部署),所以先添加Docker容器日志目录挂载宿主机
然后启动发布到服务器上
查看 Logstash 处理日志
docker logs logstash
然后再Kibana中查找索引进行日志管理
ok!



