ELK

作者: linux_豪哥 | 来源:发表于2020-03-26 16:57 被阅读0次

一.ELK简介

E: elasticsearch    java    复制存储收集过来的日志
L: logstash         java    负责收集日志,具有过滤功能
K: kibana           java    负责过滤,分析,绘图展示日志数据
F: filebeat         go      负责收集日志,更轻量对性能要求较低

二.ELK安装部署

收集nginx日志
ES
filebeat
kibana
es-head

0.更新系统时间
ntpdate time1.aliyun.com

1.安装nginx
[root@db-01 ~]# cat /etc/yum.repos.d/nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/releasever/basearch/
gpgcheck=0
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/releasever/basearch/
gpgcheck=0
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key

yum makecache fast
yum install nginx -y
systemctl start nginx

2.安装filebeat
rpm -ivh filebeat-6.6.0-x86_64.rpm
rpm -qc filebeat

3.配置filebeat
[root@db-01 /data/soft]# cat /etc/filebeat/filebeat.yml
filebeat.inputs:

  • type: log
    enabled: true
    paths:
    • /var/log/nginx/access.log

output.elasticsearch:
hosts: ["10.0.1.51:9200"]

inputs 写要收集的日志路径,收集那个机器的日志filebeat就安装在哪里
output 写es的地址,把日志放到哪里

4.启动并检查
systemctl start filebeat
tail -f /var/log/filebeat/filebeat

5.查看日志结果
es-head查看


image.png

6.kibana查看


image.png
image.png
image.png

三.ELK收集nginx日志json格式

filebeat收集nginx的json格式日志
1.上面方案不完善的地方
日志都在一个字段的valuse里,不能拆分单独显示,都记录在message


image.png

2.理想中的情况
将日志里每一个选项的内容都拆分出来
拆分成key-valuse形式,json格式
理想中存在ES里的数据格式

{
    $remote_addr : 192.168.12.254
    - : -
    $remote_user : -
    [$time_local]: [10/Sep/2019:10:52:08 +0800]
    $request: GET /jhdgsjfgjhshj HTTP/1.0
    $status : 404
    $body_bytes_sent : 153
    $http_referer : -
    $http_user_agent :ApacheBench/2.3
    $http_x_forwarded_for:-
}

3.目标如何使nginx日志格式转换成我们想要的json格式
修改nginx配置文件使日志转换成json,其实就是将格式改成key-valuse这样出来的效果就是json格式。

log_format json '{ "time_local": "$time_local", '
                          '"remote_addr": "$remote_addr", '
                          '"referer": "$http_referer", '
                          '"request": "$request", '
                          '"status": $status, '
                          '"bytes": $body_bytes_sent, '
                          '"agent": "$http_user_agent", '
                          '"x_forwarded": "$http_x_forwarded_for", '
                          '"up_addr": "$upstream_addr",'
                          '"up_host": "$upstream_http_host",'
                          '"upstream_time": "$upstream_response_time",'
                          '"request_time": "$request_time"'
    ' }';

    access_log  /var/log/nginx/access.log  json;

nginx -t
systemctl restart nginx
转换完之后的nginx的日志

image.png

4.nginx转换成json之后仍然不完善的地方

通过查看发现,虽然nginx日志变成了json,但是es里还是存储在message里仍然不能拆分
目标: 如何在ES里展示的是json格式

5.修改filebeat配置文件

[root@db-01 ~]# cat /etc/filebeat/filebeat.yml 
filebeat.inputs:
- type: log
  enabled: true 
  paths:
    - /var/log/nginx/access.log
  json.keys_under_root: true
  json.overwrite_keys: true

output.elasticsearch:
  hosts: ["10.0.1.51:9200"]

重启filebeat
systemctl restart filebeat   

6.清空nginx日志

>/var/log/nginx/access.log 
可以把ES和kibana之前的filebeat索引删除,不让旧日志跟新日志混在一起。
访问一下nginx,ES收到的日志格式就变成了json
image.png

kibana可以根据key来查看数据了,想看那个数据值直接添加就可以了,很方便。


image.png

四.filebeat工作模式

1.如果没日志filebeat就不会发送给ES数据
2.重启filebeat不会从头开始读日志
3.类似于tial -f
4.当filebeat停止的时候,会记录停止那一刻记录的行数,下次启动的时候,从上次记录的下一行开始读数据
5.filebeat对于已经发送给ES的数据不关心

举例说明

12:05 读取nginx日志
nginx   100行
停止了filebeat     读取到100行
es      100行
es      删除了filebeat索引

12:06 写入了新的日志
nginx   120行    新增20行
启动filebeat     101-最后一行
es      20行

五.自定义索引名称并按月生成

理想中的情况:
nginx_access-xxxxx-年-月

1.配置filebeat实现自定义索引名称

[root@db-01 ~]# cat /etc/filebeat/filebeat.yml 
filebeat.inputs:
- type: log
  enabled: true 
  paths:
    - /var/log/nginx/access.log
  json.keys_under_root: true
  json.overwrite_keys: true

output.elasticsearch:
  hosts: ["10.0.1.51:9200"]
  index: "nginx_access-%{[beat.version]}-%{+yyyy.MM}"
setup.template.name: "nginx"
setup.template.pattern: "nginx_*"
setup.template.enabled: false
setup.template.overwrite: true
  index  索引格式 前缀-版本号-年月日(+yyyy.MM.dd)
模板名称  nginx
模板名称匹配模式  nginx_*
默认模板名称   关闭
覆盖之前模板   开启

2.重新filebeat后查看是否生成对应的索引
nginx_access-6.6.0-2020.04

image.png

六.按日志分类存储--tags

理想中的情况:
nginx_access-6.6.0-2020.04
nginx_error-6.6.0-2020.04

1.配置filebeat实现根据不同条件存储到不同的索引

[root@db-01 ~]# cat /etc/filebeat/filebeat.yml 
filebeat.inputs:
- type: log
  enabled: true 
  paths:
    - /var/log/nginx/access.log
  json.keys_under_root: true
  json.overwrite_keys: true
  tags: ["access"]

- type: log
  enabled: true 
  paths:
    - /var/log/nginx/error.log
  tags: ["error"]

output.elasticsearch:
  hosts: ["10.0.0.51:9200"]
  indices:
    - index: "nginx_access-%{[beat.version]}-%{+yyyy.MM}"
      when.contains:
        tags: "access"
    - index: "nginx_error-%{[beat.version]}-%{+yyyy.MM}"
      when.contains:
        tags: "error"

setup.template.name: "nginx"
setup.template.pattern: "nginx_*"
setup.template.enabled: false
setup.template.overwrite: true

解释
indices: 多个索引
when.contains: 当下面写的key含有什么时就显示上面index的名称
tags: "access" 当tags含有access时就显示上面的索引名称
tags是自定义的key用作判断的(不能改其他的名字只能是tags)
如果不添加tags就选取索引中能区分类别的key,一般是路径的key,可路径的key一般都比较长。索引自己添加一个key比较方便。

2.删除以前的旧索引并重启filebeat
systemctl restart filebeat

image.png

我们还可以利用上面的分类方法对域名进行分类

七.收集tomcat日志json格式

1. 安装tomcat

yum install tomcat tomcat-webapps tomcat-admin-webapps tomcat-docs-webapp tomcat-javadoc -y

2.配置tomcat日志格式为json

将json格式日志代码直接覆盖原139行代码
[root@db-01 /etc/tomcat]# sed -n '139p' server.xml
pattern="{"clientip":"%h","ClientUser":"%l","authenticated":"%u","AccessTime":"%t","method":"%r","status":"%s","SendBytes":"%b","Query?string":"%q","partner":"%{Referer}i","AgentVersion":"%{User-Agent}i"}"/>

3.启动tomcat

systemctl start tomcat

4.配置filebeat

4.1 只收集tomcat的日志

[root@db-01 /etc/tomcat]# cat /etc/filebeat/filebeat.yml 
filebeat.inputs:

- type: log
  enabled: true 
  paths:
    - /var/log/tomcat/localhost_access_log.*.txt
  json.keys_under_root: true
  json.overwrite_keys: true
  tags: ["tomcat"]

output.elasticsearch:
  hosts: ["10.0.1.51:9200"]
  index: "tomcat_access-%{[beat.version]}-%{+yyyy.MM}"

setup.template.name: "tomcat"
setup.template.pattern: "tomcat_*"
setup.template.enabled: false
setup.template.overwrite: true

4.2 收集nginx也收集tomcat

filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/log/nginx/access.log
  json.keys_under_root: true
  json.overwrite_keys: true
  tags: ["access"]

- type: log
  enabled: true
  paths:
    - /var/log/nginx/error.log
  tags: ["error"]

- type: log
  enabled: true
  paths:
    - /var/log/tomcat/localhost_access_log.*.txt
  json.keys_under_root: true
  json.overwrite_keys: true
  tags: ["tomcat"]

output.elasticsearch:
  hosts: ["10.0.1.51:9200"]
  indices:
    - index: "nginx_access-%{[beat.version]}-%{+yyyy.MM}"
      when.contains:
        tags: "access"
    - index: "nginx_error-%{[beat.version]}-%{+yyyy.MM}"
      when.contains:
        tags: "error"
    - index: "tomcat_access-%{[beat.version]}-%{+yyyy.MM}"
      when.contains:
        tags: "tomcat"

setup.template.name: "nginx"
setup.template.pattern: "nginx_*"
setup.template.enabled: false
setup.template.overwrite: true

最后的setup设置的nginx不会影响到tomcat的索引名称,本人下面的图片就是使用的这个filebeat配置文件生成的。

5.重启filebeat

systemctl restart filebeat

6.访问tomcat查看是否有数据生成
image.png

日志也是json格式


image.png
image.png

八.收集JAVA日志

java日志的特点:

1.报错信息多
2.报错信息多还是一个事件,不能分开看。

一段java报错日志如下:

[2020-04-03T18:41:52,310][ERROR][o.e.b.Bootstrap          ] [OQFRVkI] Exception
java.lang.IllegalArgumentException: unknown setting [nnode.name] did you mean [node.name]?
        at org.elasticsearch.common.settings.AbstractScopedSettings.validate(AbstractScopedSettings.java:482) ~[elasticsearch-6.6.0.jar:6.6.0]
        at org.elasticsearch.common.settings.AbstractScopedSettings.validate(AbstractScopedSettings.java:427) ~[elasticsearch-6.6.0.jar:6.6.0]
        at org.elasticsearch.common.settings.AbstractScopedSettings.validate(AbstractScopedSettings.java:398) ~[elasticsearch-6.6.0.jar:6.6.0]
        at org.elasticsearch.common.settings.AbstractScopedSettings.validate(AbstractScopedSettings.java:369) ~[elasticsearch-6.6.0.jar:6.6.0]
        at org.elasticsearch.common.settings.SettingsModule.<init>(SettingsModule.java:148) ~[elasticsearch-6.6.0.jar:6.6.0]
        at org.elasticsearch.node.Node.<init>(Node.java:372) ~[elasticsearch-6.6.0.jar:6.6.0]
        at org.elasticsearch.node.Node.<init>(Node.java:265) ~[elasticsearch-6.6.0.jar:6.6.0]
        at org.elasticsearch.bootstrap.Bootstrap$5.<init>(Bootstrap.java:212) ~[elasticsearch-6.6.0.jar:6.6.0]
        at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:212) ~[elasticsearch-6.6.0.jar:6.6.0]
        at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:333) [elasticsearch-6.6.0.jar:6.6.0]
        at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:159) [elasticsearch-6.6.0.jar:6.6.0]
        at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:150) [elasticsearch-6.6.0.jar:6.6.0]
        at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:86) [elasticsearch-6.6.0.jar:6.6.0]
        at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:124) [elasticsearch-cli-6.6.0.jar:6.6.0]
        at org.elasticsearch.cli.Command.main(Command.java:90) [elasticsearch-cli-6.6.0.jar:6.6.0]
        at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:116) [elasticsearch-6.6.0.jar:6.6.0]
        at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:93) [elasticsearch-6.6.0.jar:6.6.0]
[2020-04-03T18:41:52,316][WARN ][o.e.b.ElasticsearchUncaughtExceptionHandler] [OQFRVkI] uncaught exception in thread [main]

如果按收集其他日志的方式收集Java程序的日志,则会把一个报错信息认为是多个而不是一个报错了;所以我们要解决这个情况,收集的时候能把多行的报错信息看成是一个,而不是分为多个。

匹配思路:

1.java报错日志特点
日志都是以[日期]开头的
报错信息不是以[开头的
2.匹配以[开头的行,一直到下一个以[开头的行,中间所有的数据属于一个事件,放在一起发给ES

filebeat配置多行匹配模式:

[root@db-01 ~]# cat /etc/filebeat/filebeat.yml

filebeat.inputs:
- type: log
  enabled: true 
  paths:
    - /var/log/elasticsearch/elasticsearch.log
  multiline.pattern: '^\['
  multiline.negate: true
  multiline.match: after

output.elasticsearch:
  hosts: ["10.0.1.51:9200"]
  index: "es-%{[beat.version]}-%{+yyyy.MM}"

setup.template.name: "es"
setup.template.pattern: "es_*"
setup.template.enabled: false
setup.template.overwrite: true

解释

multiline.pattern: '^\['                  
multiline.negate: true                 
multiline.match: after
多行匹配以'['开头的行(正则)
negate参数为false,表示符合pattern、match条件的行会融入多行之中、成为一条完整日志的中间部分。如果match=after,则以'['开头的和前面一行将合并成一条完整日志;如果match=before,则以'['开头的和后面一行将合并成一条完整日志。
negate参数为true,表示符合match条件的行是多行的开头,是一条完整日志的开始或结尾。如果match=after,则以'['开头的行是一条完整日志的开始,它和后面多个不以'['开头的行组成一条完整日志;如果match=before,则以'['开头的行是一条完整日志的结束,和前面多个不以'['开头的合并成一条完整日志。

九.kibana画图

filebeat配置文件可以配置成只收集nginx日志,方便我们学习。

filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/log/nginx/access.log
  json.keys_under_root: true
  json.overwrite_keys: true
output.elasticsearch:
  hosts: ["10.0.1.51:9200"]
  index: "nginx_access-%{[beat.version]}-%{+yyyy.MM}"
setup.template.name: "nginx"
setup.template.pattern: "nginx_*"
setup.template.enabled: false
setup.template.overwrite: true

进行多次访问,多ip的访问 ,多域名的访问。

找出排名前五的ip

image.png image.png image.png image.png image.png

找出访问前五的url

image.png image.png image.png image.png

查看日志状态码百分比--饼图

image.png image.png image.png image.png

词云图

image.png image.png image.png

markdown

image.png image.png

将save的图合成一张大图

image.png image.png image.png

图片的数据是实时更新的

相关文章

  • Docker下ELK设置

    1获取、启动elk 1.1获取elk镜像 $ docker pull sebp/elk 1.2启动elk镜像 启动...

  • Spring Cloud学习day108:ELK

    一、ELK介绍 1.ELK解决了什么问题? ELK的介绍:示例 ELK的架构原理:示例 二、安装ELK 1.安装E...

  • ELK日志分析系统初体验

    1 ELK技术栈 1.0 官方文档 ELK logstash elasticsearch kibana ELK技术...

  • 1.ELK介绍

    1.1 ELK简介 1.1.1 ELK是什么? ELK Stack 是 Elasticsearch、Logstas...

  • ELK扫盲以及搭建

    1. ELK部署说明 1.1ELK介绍: 1.1.1 ELK是什么? ELK是三个开源软件的缩写,分别表示:Ela...

  • 二、ELK工作原理

    ELK工作原理 ELK含义 ELK由ElasticSearch、Logstash和Kiabana三个开源工具组成。...

  • ELK基本部署

    ELK简介 什么是ELK?通俗来讲,ELK是由Elasticsearch、Logstash、Kibana 三个开源...

  • docker swarm elk 日志收集 kibana

    准备三个节点 elk1、elk2、elk3 准备elk环境 准备swarm环境 准备启动 备注: 源码地址 htt...

  • ELK搭建

    ELK(ElasticSearch, Logstash, Kibana) ELK(ElasticSearch, L...

  • 全文检索--ELK(六)

    一、ELK简介   ELK是当下流行的日志监控系统。ELK是Elasticsearch、Logstash、Kiba...

网友评论

      本文标题:ELK

      本文链接:https://www.haomeiwen.com/subject/ymkcuhtx.html