ELK:Elasticsearch 搜索引擎、Logstash 日志收集、Kibana 视图展现
Elasticsearch 搜索引擎
1.mac安装方式
安装:
brew install elasticsearch
启动:
brew services start elasticsearch
停止:
brew services stop elasticsearch
前台启动:
elasticsearch
2.官方下载包方式
启动:cd 进入elasticsearch文件夹bin目录 sh elasticsearch
安装head插件
github地址:https://github.com/mobz/elasticsearch-head
下载插件并进入目录执行npm install和npm install grunt --save命令
cd /Volumes/tool/elasticsearch-head-master
npm install
npm install grunt --save
启动 npm run start
接下来让Elasticsearch连接上head,首先进入到本地安装到Elasticsearch文件夹中,然后进入config文件夹中修改elasticsearch.yml,在配置文件最下方加上cors配置:
http.cors.enabled: true
http.cors.allow-origin: "*"
保存退出并启动Elasticsearch和head插件,就可以看到elasticsearch已经连接上了head插件。
Elasticsearch主从集群
修改elasticsearch.yml加入配置
主机配置:
http.cors.enabled: true
http.cors.allow-origin: "*"
#集群名称
cluster.name: ritian
#节点名称
node.name: master
#指定为主机
node.master: true
#主机IP,默认端口为9200
network.host: 127.0.0.1
从机配置:
#集群,这个需要保证和master一致
cluster.name: ritian
#节点名称
node.name: slave1
#绑定IP
network.host: 127.0.0.1
#本机端口
http.port: 9300
#找到master节点,默认端口为9200
discovery.zen.ping.unicast.hosts: ["127.0.0.1"]</font>
注意:复制文件的时候需要无data文件夹,如果出现head中检测不到集群的情况,可以删除data文件夹。
Logstash日志收集解析
官方下载包方式
启动Logstash 进入logstash/bin目录启动logstash.sh 创建logstash.conf
Logstash传输日志到Elasticsearch读取解析 手输日志打印
input{
stdin{} #标准写入
}
output{
stdout{
codec=>rubydebug #标准输出
}
}
读取日志发送到elasticsearch
input {
file {
path => "/usr/local/Cellar/nginx/1.17.3_1/logs/*.log" # 读取日志地址
start_position => beginning
}
}
output {
elasticsearch {
hosts => "localhost:9200" #ES端口
}
}
启动:
sh logstash -f logstash.conf
在kibana中通过 GET http://localhost:9200/_cat/indices?v 查看日志文件,点击 Management选择kibana下的index patterns创建一个索引来查看日志 我们要查看logstash的日志信息,通过输入logstash-*选择查询所有日志, 然后点击next step,选择过滤模式并创建索引模式,点击Discover并选择刚创建的索引查看所有日志信息。 input 配置参考: https://www.elastic.co/guide/en/logstash/current/input-plugins.html output 配置参考: https://www.elastic.co/guide/en/logstash/current/output-plugins.html filter 配置参考: https://www.elastic.co/guide/en/logstash/6.4/filter-plugins.html Logstash Reference:https://www.elastic.co/guide/en/logstash/6.4/index.html
Logstash收集日志必要点:
1.日志文件需要有新日志产生
2.Logstash跟Elasticsearch要能通讯
Logstash去除不需要的字段
去除字段:
1.只能去除_source里的,非_source里的去除不了
2.减少ES数据库大小
3.提升搜索效率
Logstash配置去除不需要的字段
filter{
grok{
remove_field=>["message","@version","path"]
}
}
[]中填写_source中的字段
Logstash Json格式日志的采集
Json的好处
1.原生日志需要做正则匹配,比较麻烦
2.Json格式的日志不需要正则能直接分段采集
Nginx使用Json格式日志
修改nginx.conf
log_format json '{"remote_ip":"$remote_addr",'
'"time_local":"$time_local",'
'"body_sent":$body_bytes_sent,'
'"responsetime":$request_time,'
'"upstreamtime":"$upstream_response_time",'
'"upstreamhost":"$upstream_addr",'
'"http_host":"$host",'
'"method":"$request_method",'
'"url":"$request_uri",'
'"request":"$request",'
'"xff":"$http_x_forwarded_for",'
'"referer":"$http_referer",'
'"agent":"$http_user_agent",'
'"response_code":"$status"}';
filter{
json{
source => "message" #会将 message中方的数据解析为Json格式
}
}
Logstash 时间轴自定义
默认ELK时间轴:
1.以发送日志的时间为准
2.而Nginx本身记录着用户的访问时间
3.分析Nginx上的日志以用户的访问时间为准,而不以发送的时间为准
Logstash的filter里面加入配置用Nginx用户访问时间覆盖发送日志时间
time是正则解析对应的名称 01/Nov/2019:09:27:00 +0800
filter{
date{
match => ["time","dd/MMM/yyyy:HH:mm:ss Z"]
target => "@timetamp"
}
}
统计Nginx的请求和网页显示进行对比 可以看到每分钟的请求量
cat /usr/local/Cellar/nginx/1.17.3_1/logs/access.log |awk '{print $4}'|cut -b 1-19|sort|uniq -c
不同的时间格式,覆盖的时候格式要对应
1.20/Feb/2019:14:50:06 -> dd/MMM/yyyy:HH:mm:ss
2.2016-08-24 18:05:39,830 -> yyyy-MM-dd HH:mm:ss,SSS
Logstash正则提取Nginx日志
Nginx日志说明
日志记录:127.0.0.1 - root [01/Nov/2019:09:27:00 +0800] “GET /ui/fonts/inter_ui/Inter-UI-Bold.woff2 HTTP/1.1” 304 0 “http://localhost:8888/app/kibana” “Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36” “-”
1.访问地址IP
2.访问时间
3.请求方式(GET/POST)
4.请求URL
5.状态码
6.响应body大小
7.Referer
8.User Agent
Logstash正则提取日志
1.需要懂得正则,logstash支持普通正则和扩展正则
2.需要了解Grok,利用kibana的Grok学习logstash正则提取过程:
点击Dev Tools,选择Grok Debugger,将日志复制进Sample data中 ,Grok Patern中放入正则表达式。
Grok提取Nginx日志
1.Grok使用(?提取内容)来提取xxx字段
2.提取客户端IP: (?[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}) 定义字段名为IP
3.提取时间: [(?[^ ]+ +[0-9]+)\ ]
4.提取日志需要正则完整的提取所有内容,提取任何日志都可用此方法。
Logstash正则提取Nginx日志
1.在logstash.conf中加入一段filter代码
2.加入_grokparsefailure" not in [tags]and “_dateparsefailure” not in [tags]判断可以防止正则将错误输出到ES
output{
if "_grokparsefailure" not in [tags]and "_dateparsefailure" not in [tags]{
elasticsearch{
hosts=>["http://localhost:9200"]
}
}
}
filter{
grok{
match = >{
"message" => '正则表达式'
}
}
}
Kibana 数据展现
1.mac安装方式
安装:
brew install kibana
启动:
brew services start kibana
关闭:
brew services stop kibana
前台启动:
kibana
2.官网下载包即可
启动Kibana
进入kibana/bin目录sh kibana 启动,kibana.yml中的配置elasticserch地址配置为elasticsearch.host:['localhost:9200'],server:host设置为0.0.0.0供外网访问
Kibana借用Nginx实现认证
默认的kibana
1.任何人都能无密码访问kibana
2.借用Nginx实现认证
3.Nginx控制源IP访问、Nginx可以使用用户密码的方式
4.把kibana监听在127.0.0.1,然后用Nginx转发
Nginx两种限制
注:sodu nginx 查看日志 mac使用nginx需要自己创建log文件夹以及access.log日志文件
1.限制源IP访问,比较安全
修改nginx.conf 配置
location /{
allow 127.0.0.1; # allow 允许访问的IP
deny all; # deny 拒绝访问
proxy_pass http://127.0.0.1:5601/; #proxy_pass 地址转发
}
修改kibana.yml server.host 将IP绑定至127.0.0.1
2.借用nginx的用户名密码机制,配置nginx用户名密码进行登录
修改nginx.conf
location /{
auth_basic "elk 账号密码认证";
auth_basic_user_file /Volumes/tool/nginx_auth; # auth_basic_user_file 账号密码文件
proxy_pass http://127.0.0.1:5601/; # proxy_pass 地址转发
}
添加账号密码 htpasswd -cb /Volumes/tool/nginx_auth root root 一定要以这样的形式添加 否则无效
Kibana图形展示
首页区域
1.可设置查看的时间和设置自动刷新时间
2.可以根据时间查看访问量: 每秒、每分钟等
3.可以根据某个字段查询
Kibana图形有建立
1.线图的创建,可以保留多个线程
2.饼图的创建,show label
3.条形图的创建
Kibana面板的创建
1.创建面板
2.在面板上添加图形
定时刷新
创建图形
选择图形样板
选择索引
Filebeat日志收集解析
Logstash收集日志
1.依赖于java环境,用来收集日志比较重,占用内存和CPU
2.Filebeat相对轻量,占用服务器资源小
3.一般选用Filebeat来进行日志收集
Filebeat -> Elasticsearch ->Kinaba
1.只适合查看日志
2.不适合具体日志分析
3.不支持正则,不支持去除字段
Filebeat安装:官网直接下载包即可
Filebeat发送日志到Elasticsearch
修改filebeat.yml
filebeat.inputs:
- type: log
tail_file: true
backoff: "1s"
paths:
- /usr/local/Cellar/nginx/1.17.3_1/logs/*.log
output:
elasticsearch:
hosts: ["localhost:9200"]
启动Filebeat -c指定配置文件
cd 进入filebeat安装目录执行命令启动
filebeat -e -c filebeat.yml
Filebeat查看日志数据方式
GET /filebeat-7.4.1-2019.11.01-000001/_search 创建filebeat-*索引
Filebeat采集多个日志
修改Filebeat.yml配置
filebeat.inputs:
- type: log
tail_file: true
backoff: "1s"
paths:
- /usr/local/Cellar/nginx/1.17.3_1/logs/*.log
fields:
type: nginx #日志区分标识符
fields_under_root: true
- type: log #加一个type收集日志
tail_file: true
backoff: "1s"
paths:
- /Volumes/tool/apache-tomcat-8.5.40/logs/*.log
fields:
type: tomcat #日志区分标识符
fields_under_root: true
output:
logstash:
hosts: ["localhost:5044"]
Logstash如何区分日志并对日志进行不同的解析
1.Filebeat加入一定字段来进行区分
2.Logstash使用区别字段来区分
修改filebeat-logstash.conf配置文件,通过type字段进行判断区分多个日志
input {
beats{
port => 5044
}
}
filter{
if[type]=="nginx"{
json{
source=>"message" #因为nginx是json格式
}
}else if[type]=="tomcat"{
}
}
output {
if[type]=="nginx"{ #也可以通过type判断将日志传输到不同的服务器上的Elasticsearch中
elasticsearch {
hosts => "localhost:9200"
index => "nginx-%{+YYYY.MM.dd}"
}
}else if[type]=="tomcat"{
elasticsearch{
hosts => "localhost:9200"
index => "tomcat-%{+YYYY.MM.dd}"
}
}
}
Filebeat+Logstash日志收集解析
Filebeat和Logstash说明
1.Filebeat: 轻量级,但不支持正则,不支持去除字段,不需要依赖java环境
2.Logstash: 比较重,但支持正则,支持移除字段,需要依赖java环境
搭建架构演示
1.Logstash -> Elasticsearch -> Kinaba
2.Filebeat -> Elasticsearch -> Kinaba
3.Filebeat - > Logstash -> Elasticsearch -> Kinaba
修改Filebeat配置发往Logstash
filebeat.inputs:
- type: log
tail_file: true
backoff: "1s"
paths:
- /usr/local/Cellar/nginx/1.17.3_1/logs/*.log
output:
logstash:
hosts: ["localhost:5044"]
新建一个filebeat-logstash.conf
input {
beats{
host =>'0.0.0.0' #访问IP限制
port => 5044 #监听端口
}
}
output {
elasticsearch {
hosts => "localhost:9200"
}
}
Logstash上移除不必要的字段
remove_field => ["message","@version"]
Filebeat批量部署比Logstash要方便得多
1.Logstash监听在内网
2.Filebeat发送给内网的Logstash
架构如下
Filebeat(多台)
Filebeat(多台) -> Logstash(正则) -> Elasticsearch(入库) -> Kibana(展现)
Filebeat(多台)
Filebeat和Logstash间引入Redis
架构存在问题
1.Logstash性能不足
2.扩容Logstash,多台Filebeat配置可能会不一致
架构优化
Filebeat(多台) Logstash(正则)
Filebeat(多台) -> Redis , Kafka -> Logstash(正则) -> Elasticsearch -> Kibana
Filebeat(多台) Logstash(正则)
Redis安装搭建
省略。。。。。。
Filebeat配置写入Redis
修改Filebeat.yml
filebeat.inputs:
- type: log
tail_file: true
backoff: "1s"
paths:
- /usr/local/Cellar/nginx/1.17.3_1/logs/*.log
fields:
type: nginx #日志区分标识符
fields_under_root: true
output.redis:
hosts: ["127.0.0.1:6379"]
db: 2 #存储的库
timeout: 5 #连接超时
key: "logs" #存储数据的key Redis会自动创建
Logstash从Redis中读取数据
input{
redis{
host => "127.0.0.1"
port => "6379"
key => "logs" #读取的key
data_type => "list" #读取类型
db => 2 #读取的库
batch_count => 1 #这个值是指从队列中读取数据时,一次性取出多少条。不写会报错,解决办法就是,不使用这个功能,将 batch_size设置为1
}
}
output {
if[type]=="nginx"{
elasticsearch {
hosts => "localhost:9200"
index => "nginx-%{+YYYY.MM.dd}"
}
}else if[type]=="tomcat"{
elasticsearch{
hosts => "localhost:9200"
index => "tomcat-%{+YYYY.MM.dd}"
}
}
}
启动redis会发现数据库中自动创建了key “logs”
启动Filebeat后,需要nginx添加日志,Filebeat才会开始进行连接Redis并插入数据
Filebeat和Logstash间引入Kfaka
Kafka依赖于Zookeeper
1.Kafka安装:官网下载二进制安装包
2.Zookeeper安装:官网下载二进制安装包 下载bin的包
Zookeeper启动
1.进入config目录:cp zoo_sample.cfg zoo.cfg
2.更改配置添加:clientPortAddress=127.0.0.1 监听IP
2.启动: zkServer.sh start
注意点:默认使用8080端口
Kafaka启动
进入bin目录,启动:kafka-server-start.sh …/config/server.properties
Filebeat日志发送到Kafka
filebeat.inputs:
- type: log
tail_file: true
backoff: "1s"
paths:
- /usr/local/Cellar/nginx/1.17.3_1/logs/*.log
fields:
type: nginx #日志区分标识符
fields_under_root: true
output:
kafka:
hosts: ["127.0.0.1:9092"]
topic: logs
Logstash读取Kafka的数据
input{
kafka{
bootstrap_servers => "127.0.0.1:9092"
topics => ["logs"] #数组类型,可配置多个topic
group_id => "logs" #组Id可自定义
consumer_threads => 5 #消费者线程数
decorate_events => true //此属性会将当前topic、offset、group、partition等信息也带到message中
codec => "json"
}
}
output {
if[type]=="nginx"{
elasticsearch {
hosts => "localhost:9200"
index => "nginx-%{+YYYY.MM.dd}"
}
}else if[type]=="tomcat"{
elasticsearch{
hosts => "localhost:9200"
index => "tomcat-%{+YYYY.MM.dd}"
}
}
}
Kafka查看队列信息
1.查看Group: kafka-consumer-groups.sh -bootstrap-server 127.0.0.1:9092 --list
2.查看队列: kafka-consumer-groups.sh -bootstrap-server 127.0.0.1:9092 -group logs --describe