ELK日志采集服务搭建
配置环境:DOCKER ELK版本7.6.2
ELK简介:
ELK是三个开源软件的缩写,分别表示:Elasticsearch , Logstash, Kibana , 它们都是开源软件。新增了一个FileBeat,它是一个轻量级的日志收集处理工具(Agent),Filebeat占用资源少,适合于在各个服务器上搜集日志后传输给Logstash,官方也推荐此工具。
Elasticsearch 是个开源分布式搜索引擎,提供搜集、分析、存储数据三大功能。它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。
Logstash 主要是用来日志的搜集、分析、过滤日志的工具,支持大量的数据获取方式。一般工作方式为c/s架构,client端安装在需要收集日志的主机上,server端负责将收到的各节点日志进行过滤、修改等操作在一并发往elasticsearch上去。
Kibana 是一个开源和免费的工具,Kibana可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助汇总、分析和搜索重要数据日志。
Filebeat(搜集文件数据)
搭建ELK服务的步骤为:
- 安装配置elasticsearch服务
- 安装配置kibana(管理es的可视化界面)
- 安装logstash
- 安装filebeat
- 配置nginx、kibana登录验证
安装elasticsearch服务
创建es挂载目录
mkdir /app/elk/elasticsearch
mkdir /app/elk/elasticsearch/{data,plugins,config,logs}
创建并配置 vi /app/elk/elasticsearch/config/elasticsearch.yml
cluster.name: "logs-es"
network.host: 0.0.0.0
http.port: 9200
创建docker内网连接,同个内网中,可以通过容器名访问
docker network create elknet
运行docker容器 es运行内存可以适当改大
docker run --name es -p 9200:9200 -p 9300:9300 --restart=always \
--net elknet \
-e TAKE_FILE_OWNERSHIP=true --privileged=true \
-e "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms256m -Xmx256m" \
-v /app/elk/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /app/elk/elasticsearch/data:/usr/share/elasticsearch/data \
-v /app/elk/elasticsearch/logs:/usr/share/elasticsearch/logs \
-v /app/elk/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
-d docker.elastic.co/elasticsearch/elasticsearch:7.6.2
启动成功,访问http://ip:9200
安装kibana
创建kibana挂载目录
mkdir /app/elk/kibana
mkdir /app/elk/kibana/config
创建并配置 vi /app/elk/kibana/config/kibana.yml
server.name: kibana
server.host: "0.0.0.0"
elasticsearch.hosts: ["http://es:9200"]
xpack.monitoring.ui.container.elasticsearch.enabled: true
i18n.locale: "zh-CN"
docker 运行kibana
docker run --name kibana -p 5601:5601 --restart=always \
-e TAKE_FILE_OWNERSHIP=true --privileged=true \
--net elknet \
--log-driver json-file \
--log-opt max-size=100m \
--log-opt max-file=2 \
-v /app/elk/kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml \
-d docker.elastic.co/kibana/kibana:7.6.2
启动成功,访问http://ip:5601
安装logstash
创建logstash挂载文件
mkdir /app/elk/logstash
mkdir /app/elk/logstash/{conf.d,config}
创建并配置 /app/elk/logstash/config/logstash.yml
http.host: "0.0.0.0"
xpack.monitoring.elasticsearch.hosts: [ "http://es:9200" ]
path.config: /usr/share/logstash/conf.d/*.conf
创建并配置 vi /app/elk/logstash/conf.d/logstash.conf,正则匹配filebeat传过来的日志文件, 并输入到es中。注意:正则字符串不能换行,否则logstash可能匹配不到
input {
beats {
port => 5044
}
}
filter {
if "[request " in [message]{
grok{
match => {
"message" =>"%{TIMESTAMP_ISO8601:log_date} %{WORD:log_level} \s?\[%{USERNAME:log_service_name} %{USERNAME:log_trace_id} %{USERNAME:log_span_id}\] \[%{DATA:log_thread}\] %{JAVAFILE:logger_name} : \[%{WORD:log_request_response} %{USERNAME:log_session_id} %{IP:log_ip}\] \[%{USERNAME:log_app} %{USERNAME:log_version} %{USERNAME:log_from_service}\] \[(?<log_request_type>([A-Z]+)) %{PATH:log_url}\] %{GREEDYDATA:log_content}"
}
overwrite => ["message"]
}
}
else if "[response " in [message]{
grok{
match => {
"message" =>"%{TIMESTAMP_ISO8601:log_date} %{WORD:log_level} \s?\[%{USERNAME:log_service_name} %{USERNAME:log_trace_id} %{USERNAME:log_span_id}\] \[%{DATA:log_thread}\] %{JAVAFILE:logger_name} : \[%{WORD:log_request_response} %{USERNAME:log_session_id}\] \[(?<log_request_type>([A-Z]+)) %{PATH:log_url} %{INT:log_response_time}\] %{GREEDYDATA:log_content}"
}
overwrite => ["message"]
}
}
else{
grok{
match => {
"message" =>"%{TIMESTAMP_ISO8601:log_date} %{WORD:log_level} \s?\[%{USERNAME:log_service_name} %{USERNAME:log_trace_id} %{USERNAME:log_span_id}\] \[%{DATA:log_thread}\] %{JAVAFILE:logger_name} : %{GREEDYDATA:log_content}"
}
overwrite => ["message"]
}
}
}
output {
elasticsearch {
hosts => ["http://es:9200"]
index => "springboot_log_%{+YYYY-MM-dd}"
}
}
docker运行logstash logstash内存可以适当改大
docker run -d --restart=always --name logstash -p 5044:5044 \
--net elknet \
-e ES_JAVA_OPTS="-Xms256m -Xmx256m" \
-e TAKE_FILE_OWNERSHIP=true --privileged=true \
--log-driver json-file \
--log-opt max-size=100m \
--log-opt max-file=2 \
-v /app/elk/logstash/config/logstash.yml:/usr/share/logstash/config/logstash.yml \
-v /app/elk/logstash/conf.d/:/usr/share/logstash/conf.d/ \
-d docker.elastic.co/logstash/logstash:7.6.2
查看是否启动成功:docker logs logstash
安装filebeat
创建挂载文件 vi /app/elk/filebeat/filebeat.yml
filebeat.inputs:
- type: log
enabled: true
paths:
- /xxxx/xxxx.log
- /xxxxxxxx/xxxx.log
multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}'
multiline.negate: true
multiline.match: after
output.logstash:
hosts: ["logstash_host:5044"]
docker 启动filebeat,--hostname 主机名称,判断日志来自于台主机
docker run --restart=always --hostname hysz-ali-debug-web1 \
--name=filebeat --user=root \
-v /app/elk/filebeat/filebeat.yml:/usr/share/filebeat/filebeat.yml \
-v /data0:/data0 \
-d docker.elastic.co/beats/filebeat:7.6.2 \
filebeat -e -strict.perms=false
配置nginx、kibana登录验证
kibana配置登录验证方式①
使用httpd-tools 工具生成密钥验证
安装httpd-tools
yum install httpd-tools
创建密钥文件
mkdir /etc/nginx/passwd
生成密钥文件
htpasswd -c -b /etc/nginx/passwd/kibana.passwd 登录用户名 密码
配置nginx代理kibana
server{
listen 80;
server_name kibana.com;
auth_basic "Kibana Auth";
auth_basic_user_file /etc/nginx/passwd/kibana.passwd;
location / {
proxy_pass http://kibana_host:5601;
proxy_redirect off;
}
}
配置完成-》访问配置的kibana的域名
kibana配置登录方式②
使用 nginx-ldap-auth-daemon 验证
下载nginx-ldap-auth-daemon源码
git clone https://github.com/nginxinc/nginx-ldap-auth.git
将cd到nginx-ldap-auth-daemon目录并将其打包成docker镜像,打包过程有点久,耐心等待
docker build -t nginx-ldap-auth-daemon .
打包完成启动容器
docker run --name=nginx-ldap -p 8888:8888 -d nginx-ldap-auth-daemon:latest
配置nginx的映射登录
http {
#......省略其他配置
#开启nginx验证的cookie缓存空间 #无操作10分钟过期
proxy_cache_path cache/ keys_zone=auth_cache:10m;
#扫描这个目录下的所有.conf
include /etc/nginx/conf/*.conf;
}
配置nginx的kibana域名映射 /etc/nginx/conf/kibana.conf 本文中的xxxx更换成实际使用的文本
server {
listen 80;
server_name kibana.xxxx.com;
location / {
auth_request /auth-proxy;
proxy_pass http://xxxx:5601/;
}
# 这是用做 auth_request 请求的路径
location = /auth-proxy {
internal;
# nginx-ldap-auth-daemon 启动的地址
proxy_pass http://nginx-ldap-host:8888;
proxy_pass_request_body off;
proxy_set_header Content-Length "";
proxy_cache auth_cache;
proxy_cache_valid 200 10m; #无操作10分钟过期
# cookie 会加在这里
proxy_cache_key "$http_authorization$cookie_nginxauth";
# ldap 的地址
proxy_set_header X-Ldap-URL "ldap://xxxx:389";
# ldap 的 BaseDN
proxy_set_header X-Ldap-BaseDN "dc=xxxx,dc=com";
# ldap 的 binddn,也就是有查询权限的账号
proxy_set_header X-Ldap-BindDN "cn=admin,dc=xxxx,dc=com";
# binddn 的密码
proxy_set_header X-Ldap-BindPass "xxxx";
# cookie 的名字和值
proxy_set_header X-CookieName "nginxauth";
proxy_set_header Cookie nginxauth=$cookie_nginxauth;
# ldap 的 searchFilter,就是拿哪个字段作为认证的用户名
proxy_set_header X-Ldap-Template "(&(uid=%(username)s)(memberOf=cn=kibana-test,ou=servers-login,dc=xxxx,dc=com))";
}
}
配置完成-》访问配置的kibana的域名