一、环境:
Ubuntu18.04 + Docker 18.09 + ELK Docker Image 7.1
二、安装部署:
1、Docker
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo usermod -aG docker $(whoami)
sudo systemctl start docker
sudo systemctl status docker
2、Elasticsearch
docker pull docker.elastic.co/elasticsearch/elasticsearch:7.1.0
sudo apt install docker-compose
sudo bash -c "echo 'vm.max_map_count=262144' >> /etc/sysctl.conf"
sudo sysctl -p
sudo mkdir -p /data/elasticsearch/data
sudo vim docker-compose.yml
sudo chown -R yimi.yimi elasticsearch/
sudo docker-compose up -d
docker ps -a
curl http://127.0.0.1:9200/_cat/health
docker-compose down -v
3、Kibana
docker pull docker.elastic.co/kibana/kibana:7.1.0
sudo mkdir /data/kibana
sudo vim docker-compose.yml
sudo docker-compose up -d
docker logs kibana
4、Logstash
docker pull docker.elastic.co/logstash/logstash:7.1.0
docker run -it --rm docker.elastic.co/logstash/logstash:7.1.0 -e 'input { stdin { } } output { stdout { } }'
sudo mkdir /data/logstash/
sudo chown -R yimi.yimi logstash/
docker run -d -p 5044:5044 --name logstash --network elasticsearch_esnet \
-v /data/logstash/logstash.conf:/usr/share/logstash/pipeline/logstash.conf \
-v /data/logstash/logstash.yml:/usr/share/logstash/config/logstash.yml \
docker.elastic.co/logstash/logstash:7.1.0
5、Filebeat
1)非Docker模式:
# 1.edit config with logstash
# 2.Index setup
filebeat setup --template -E output.logstash.enabled=false -E 'output.elasticsearch.hosts=["http://10.15.1.27:9200"]'
# 3.kibana setup
filebeat setup -e \
-E output.logstash.enabled=false \
-E output.elasticsearch.hosts=['http://10.15.1.27:9200'] \
-E setup.kibana.host=http://10.15.1.27:5601
# 4.startup filebeat:
sudo service filebeat start
####2)Docker模式:
docker run \
docker.elastic.co/beats/filebeat:7.1.1 \
setup -E setup.kibana.host=kibana:5601 \
-E output.elasticsearch.hosts=["elasticsearch:9200"]
docker run docker.elastic.co/beats/filebeat:7.1.1 setup \
--network elasticsearch_esnet --template -E output.logstash.enabled=false \
-E 'output.elasticsearch.hosts=["es01:9200"]'
docker run --net="host" docker.elastic.co/beats/filebeat:7.1.1 setup -e \
-E output.logstash.enabled=false \
-E output.elasticsearch.hosts=['localhost:9200'] \
-E output.elasticsearch.username=filebeat_internal \
-E output.elasticsearch.password=YOUR_PASSWORD \
-E setup.kibana.host=localhost:5601
6、X-PACK
x-pack是elasticsearch的一个扩展包,将安全,警告,监视,图形和报告功能捆绑在一个易于安装的软件包中。
因为x-pack是收费的,所以试用期只有一个月。长期使用就必须根据官网文档说得来,也是给我们后门,一年一年的续期。
如果要认证,建议用Nginx做反向代理+认证
三、ELK 使用步骤:
Spring Boot 日志输出到指定目录,Filebeat 进行采集,Logstash 进行过滤,Elasticsearch 进行存储,Kibana 进行展示。
Filebeat 示例配置(vi /etc/filebeat/filebeat.yml
):
filebeat.prospectors:
- input_type: log
paths:
- /var/log/spring-boot-log4j2/*.log
document_type: "spring-boot-log4j2" # 定义写入 ES 时的 _type 值
multiline:
#pattern: '^\s*(\d{4}|\d{2})\-(\d{2}|[a-zA-Z]{3})\-(\d{2}|\d{4})' # 指定匹配的表达式(匹配以 2017-11-15 08:04:23:889 时间格式开头的字符串)
pattern: '^\s*("{)' # 指定匹配的表达式(匹配以 "{ 开头的字符串)
negate: true # 是否匹配到
match: after # 合并到上一行的末尾
max_lines: 1000 # 最大的行数
timeout: 30s # 如果在规定的时候没有新的日志事件就不等待后面的日志
fields:
logsource: node1
logtype: spring-boot-log4j2
- input_type: log
paths:
- /var/log/messages
#- /var/log/*.log
document_type: "syslog" # 定义写入 ES 时的 _type 值
fields:
logsource: node1
logtype: syslog
#output.elasticsearch:
#hosts: ["node1:9200"]
output.logstash:
hosts: ["node1:10515"]
上面的配置需要注意几点:
pattern
:配置的正则表达式,是为了合并异常信息(而不是单行显示),匹配以"{
开头的字符串(判断是否 Json 格式),如果匹配不到的话,就进行合并行。document_type
:配置的是 Elasticsearch 的 Type 值,方便 Elasticsearch 对日志数据的归类。logtype
:新增的字段,用于 Filebeat 和 Logstash 之间传递参数,进行过滤的判断逻辑。
Logstash 示例配置(vi /etc/logstash/conf.d/logstash.conf
):
input {
beats {
port => 10515
}
}
filter {
if [fields][logtype] == "syslog" {
grok {
match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}"
add_field => [ "received_at", "%{@timestamp}" ]
add_field => [ "received_from", "%{host}" ]
}
syslog_pri { }
date {
match => [ "syslog_timestamp", "MMM d HH:mm:ss", "MMM dd HH:mm:ss" ]
}
}
if [fields][logtype] == "spring-boot-log4j2" {
json {
source => "message"
target => "data"
}
}
}
output {
if [fields][logtype] == "spring-boot-log4j2"{
elasticsearch {
hosts => ["127.0.0.1:9200"]
index => "spring-boot-log4j2-%{+YYYY.MM.dd}"
}
}
if [fields][logtype] == "syslog"{
elasticsearch {
hosts => ["127.0.0.1:9200"]
index => "filebeat-%{+YYYY.MM.dd}"
}
}
}
上面的配置需要注意几点:
- logstash.conf:配置文件可以配置多个,
input
、filter
和output
可以单独文件配置。 - fields logtype:就是上面 Filebeat 配置的字段,这边用来判断服务来源,然后进行单独的处理。
- filter:过滤器做了两件事,一个是使用
grok
插件,匹配数据和增加字段值,另一个就是使用json
插件,将字符串转换成 Json 对象(会创建data
层级结构,如果不想新建层级的话,删掉target
配置即可)。 - output:根据
logtype
判断,输出到指定的 Elasticsearch 地址,以及创建指定的索引。
简单总结下, Filebeat 是客户端,一般部署在 Service 所在服务器(有多少服务器,就有多少 Filebeat),不同 Service 配置不同的input_type
(也可以配置一个),采集的数据源可以配置多个,然后 Filebeat 将采集的日志数据,传输到指定的 Logstash 进行过滤,最后将处理好的日志数据,存储到指定的 Elasticsearch。
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 lxwno.1@163.com