部署ELK+Filebeat日志收集分析系统

[复制链接]
feng 发表于 2022-6-6 13:46:16 | 显示全部楼层 |阅读模式
本帖最后由 feng 于 2022-6-13 11:47 编辑

部署ELK+Filebeat日志收集分析系统

需求背景:

业务发展越来越庞大,服务器越来越多
各种访问日志、应用日志、错误日志量越来越多,导致运维人员无法很好的去管理日志
开发人员排查问题,需要到服务器上查日志,不方便
运营人员需要一些数据,需要我们运维到服务器上分析日志

注意事项:
* elasticsearch、kibana,logstash,filebeat  版本要一致,如7.13.2,则全部用此版本号进行安装;
* 服务器均在同一网段内

1、环境准备
1.1 环境规划
环境准备的机器
IP地址    主机名    部署服务
192.168.15.77    log server    elasticsearch、kibana
192.168.15.78    log node1    elasticsearch、logstash
192.168.15.79    hog node2     elasticsearch、filebeat

3台机器均修改网络配置文件
[root@log ~]# vi /etc/hosts
192.168.15.77 logserver
192.168.15.78 lognode1
192.168.15.79 lognode2

1.2 软件版本下载
注意:这边根据实际情况
3台机器全部安装jdk11,因为elasticsearch是java开发的

jdk 11查询java可安装版本:
yum list java*
安装java11,使用命令 :
# yum install java-11-openjdk-devel.x86_64
输入y,安装完成后。使用java -version查看java版本信息如下:
[root@log ~]# java -version
openjdk version "11.0.15" 2022-04-19 LTS
OpenJDK Runtime Environment 18.9 (build 11.0.15+9-LTS)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.15+9-LTS, mixed mode, sharing)

[root@log ~]# javac -version
javac 11.0.15


elasticsearch-7.13.2-linux-x86_64.tar.gz
kibana-7.13.2-linux-x86_64.tar.gz
logstash‐7.13.2‐linux‐x86_64.tar.gz
filebeat‐7.13.2‐linux‐x86_64.tar.gz

安装包下载
https://artifacts.elastic.co/dow ... linux-x86_64.tar.gz
https://artifacts.elastic.co/dow ... linux-x86_64.tar.gz
https://artifacts.elastic.co/dow ... linux-x86_64.tar.gz
https://artifacts.elastic.co/dow ... linux-x86_64.tar.gz

2、部署ElasticSearch集群
2.1 安装ElasticSearch
三个节点都需安装,ElasticSearch的设置访问端口:9200 、9300

wget https://artifacts.elastic.co/dow ... linux-x86_64.tar.gz
tar zxf elasticsearch-7.13.2-linux-x86_64.tar.gz -C /usr/local/
mv /usr/local/elasticsearch-7.13.2 /usr/local/elasticsearch


e)启动 cd bin ./elasticsearch -d

2.1.1 配置es-01节点
[root@es-01 ~]# grep '^[a-z]' /usr/local/elasticsearch/config/elasticsearch.yml
cluster.name: my-es
node.name: node-1
node.master: true
node.data: true
path.data: /data/elasticsearch/data
path.logs: /data/logs/elasticsearch
network.host: 192.168.15.77
http.port: 9200
discovery.seed_hosts: ["192.168.15.77","192.168.15.78","192.168.15.79"] #指定集群成员,用于主动发现他们, 所有成员都要写进来,包括自己,每个节点中应该写一样的信息
cluster.initial_master_nodes: ["node-1"]
http.cors.enabled: true   # 是否支持跨域,默认为false
http.cors.allow-origin: "*"  # 当设置允许跨域,默认为*,表示支持所有域名,如果我们只是允许某些网站能访问,那么可以使用正则表达式。比如只允许本地地址。 /https?:\/\/localhost(:[0-9]+)?/

2.1.2 配置es-02节点
只是配置文件中node.name、node.master和network.host不同,其他操作方式一致

[root@es-02 ~]# grep '^[a-z]' /usr/local/elasticsearch/config/elasticsearch.yml
cluster.name: my-es
node.name: node-2
node.master: false
node.data: true
path.data: /data/elasticsearch/data
path.logs: /data/logs/elasticsearch
network.host: 192.168.15.78
http.port: 9200
discovery.seed_hosts: ["192.168.15.77","192.168.15.78","192.168.15.79"]
cluster.initial_master_nodes: ["node-1"]
http.cors.enabled: true
http.cors.allow-origin: "*"

2.1.3 配置es-03节点
只是配置文件中node.name、node.master和network.host不同,其他操作方式一致

[root@es-03 ~]# grep '^[a-z]' /usr/local/elasticsearch/config/elasticsearch.yml
cluster.name: my-es
node.name: node-3
node.master: false
node.data: true
path.data: /data/elasticsearch/data
path.logs: /data/logs/elasticsearch
network.host: 192.168.15.79
http.port: 9200
discovery.seed_hosts: ["192.168.15.77","192.168.15.78","192.168.15.79"]
cluster.initial_master_nodes: ["node-1"]
http.cors.enabled: true
http.cors.allow-origin: "*"

#配置时一定要注册去掉#号的项目,留一下英文空格,冒号左侧不要留空格。

2.2 创建目录及用户
三台机器都需创建
groupadd elastic &&  useradd elastic -g elastic -p elasticsearch
mkdir -p /data/elasticsearch/data /data/logs/elasticsearch
chown -R elastic:elastic /data/elasticsearch/data /data/logs/elasticsearch/  /usr/local/elasticsearch

2.3 启动集群ElasticSearch
su elastic -c "/usr/local/elasticsearch/bin/elasticsearch -d"

检查集群环境日志是否正常
2.4 查看集群状态
[root@es-01 ~]# curl "http://192.168.15.77:9200/_cluster/health?pretty"
{
  "cluster_name" : "glog",
  "status" : "green",   # 为green则代表健康没问题,如果是yellow或者red则是集群有问题
  "timed_out" : false,   # 是否有超时
  "number_of_nodes" : 3,  # 集群中的节点数量
  "number_of_data_nodes" : 3,  # 集群中data节点的数量
  "active_primary_shards" : 0,
  "active_shards" : 0,
  "relocating_shards" : 0,
  "initializing_shards" : 0,
  "unassigned_shards" : 0,
  "delayed_unassigned_shards" : 0,
  "number_of_pending_tasks" : 0,
  "number_of_in_flight_fetch" : 0,
  "task_max_waiting_in_queue_millis" : 0,
  "active_shards_percent_as_number" : 100.0
}

检查没有问题后,我们的es集群就搭建完成了,很简单。

3、部署Kibana
3.1 安装Kibana
[root@es-01 ~]# wget https://artifacts.elastic.co/dow ... linux-x86_64.tar.gz
[root@es-01 ~]# tar zxf kibana-7.13.2-linux-x86_64.tar.gz -C /usr/local/
[root@es-01 ~]# mv /usr/local/kibana-7.13.2-linux-x86_64/ /usr/local/kibana

3.2 配置主配置文件
[root@es-01 ~]# grep '^[a-z]' /usr/local/kibana/config/kibana.yml
server.port: 5601
server.host: "192.168.15.77"  # 配置监听ip
server.name: "elk-application"
elasticsearch.hosts: ["http://192.168.15.77:9200"]  ## 配置es服务器的ip,如果是集群则配置该集群中主节点的ip
logging.dest :  /data/logs/kibana/kibana.log   # 配置kibana的日志文件路径,不然默认是messages里记录日志
i18n.locale: "zh-CN"   # 设置页面的字体为中文

3.3 创建用于运行 kibana 的普通用户
默认情况下, kibana 不允许使用 root 用户运行,所以这里创建一个普通用户

[root@es-01 ~]# groupadd kibana &&  useradd kibana -g kibana -p kibana

3.4 创建程序使用到的目录并赋予权限
[root@es-01 ~]# mkdir  /data/logs/kibana /run/kibana
[root@es-01 ~]# chown -R  kibana:kibana /usr/local/kibana /data/logs/kibana/  /run/kibana

3.5 启动kibana服务,并检查进程和监听端口
[root@es-01 ~]# nohup su kibana -c "/usr/local/kibana/bin/kibana" &
[root@es-01 ~]# ps aux|grep kibana
root      91686  0.0  0.1 191744  2340 pts/1    S    13:37   0:00 su kibana -c /usr/local/kibana/bin/kibana
kibana    91688  8.3  2.3 614116 44604 ?        Ssl  13:37   0:00 /usr/local/kibana/bin/../node/bin/node /usr/local/kibana/bin/../src/cli/dist
kibana    91700 90.4  5.9 899460 111544 ?       Rl   13:37   0:04 /usr/local/kibana/node/bin/node --preserve-symlinks-main --preserve-symlinks /usr/local/kibana/src/cli/dist
root      91716  0.0  0.0 112720   980 pts/0    S+   13:37   0:00 grep --color=auto kibana
[root@es-01 ~]# netstat -lntp |grep 5601
tcp        0      0 192.168.15.77:5601      0.0.0.0:*               LISTEN      91700/node      

注:由于kibana是使用node.js开发的,所以进程名称为node
然后在浏览器里进行访问,如:http://192.168.15.77:5601/,由于我们并没有安装x-pack,所以此时是没有用户名和密码的,可以直接访问的:

到此我们的kibana就安装完成了,很简单,接下来就是安装logstash,不然kibana是没法用的。

4、部署Filebeat  #第3台里部署

4.1 Filebeat 安装
---------------------------------------------------------------------------------------------------------------
RPM安装方法,容易成功
wget https://artifacts.elastic.co/dow ... t-7.13.2-x86_64.rpm
yum localinstall filebeat-7.13.2-x86_64.rpm
但安装目录比较分散whereis filebeat的目录:filebeat: /usr/bin/filebeat /etc/filebeat /usr/share/filebeat
启动:
systemctl enable filebeat
systemctl start filebeat
---------------------------------------------------------------------------------------------------------------
源码安装方法:
[root@es-03 ~]# wget https://artifacts.elastic.co/dow ... linux-x86_64.tar.gz
[root@es-03 ~]# tar zxf filebeat-7.13.2-linux-x86_64.tar.gz -C /usr/local/
[root@es-03 ~]# mv /usr/local/filebeat-7.13.2-linux-x86_64/ /usr/local/filebeat

Filebeat启动管理
1.前台运行
采用前台运行的方式查看 Filebeat 获取的日志结果

新建filebeat用户
groupadd filebeat &&  useradd filebeat -g filebeat -p filebeat
新建filebeat用户日志等目录
mkdir  /data/logs/filebeat /run/filebeat
给刚建的目录授权
chown -R  filebeat:filebeat /usr/local/filebeat /data/logs/filebeat/  /run/filebeat
nohup运行
nohup su filebeat -c "/usr/local/filebeat" &

以root执行命令:
./filebeat -c ./filebeat.yml &

2.后台运行
使用 nohup 方式启动 Filebeat 到后台 ,日志结果可查看 nohup.out 文件
使用 systemd 管理的后台方式启动 Filebeat 进程不能查看输出日志,测试阶段误用

配置 systemd 方式的 Filebeat 启动管理文件
[root@es-03 filebeat]# vi /usr/lib/systemd/system/filebeat.service

[Unit]
Description=Filebeat sends log files to Logstash or directly to Elasticsearch.
Wants=network-online.target
After=network-online.target
[Service]
ExecStart=/usr/local/filebeat/filebeat -c /usr/local/filebeat/filebeat.yml
Restart=always
[Install]
WantedBy=multi-user.target

[root@es-03 filebeat]# systemctl daemon-reload
[root@es-03 filebeat]# systemctl start filebeat

4.2 Filebeat 简单使用
准备测试数据
94.16.136.28 - - [04/Jun/2021:16:28:22 +0800] "OST /captcha/getPic HTTP/1.1" "-" 200 22062 "https://xxx.com/index" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)Chrome/90.0.4430.212 Safari/537.36" "-" "192.168.0.75:1800" "0.090" 0.090

配置 Filebeat 的输入和输出
[root@es-03 ~]# cat /usr/local/filebeat/filebeat.yml
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /data/logs/nginx/*.log  # 指定需要收集日志的路径,支持通配符可以写多个
filebeat.config.modules:
  path: ${path.config}/modules.d/*.yml  # 内置的收集日志的模块配置文件的存放路径
  reload.enabled: false   # 当模块的配置文件有更新时,此程序是否要自动加载, false 不加载, true  加载
setup.template.settings:
  index.number_of_shards: 1
output.logstash:   # 输出到  logstash
  hosts: ["192.168.15.78:5044"]
processors:
  - add_host_metadata:  #  添加此主机的源数据信息到输出数据中,比如  IP MAC OS  等信息
      when.not.contains.tags: forwarded
  - add_cloud_metadata: ~
  - add_docker_metadata: ~
  - add_kubernetes_metadata: ~

运行观察日志输出

找不到配置文件可使用-c指定配置文件位置

[root@es-03 ~]# /usr/local/filebeat/filebeat -c /usr/local/filebeat/filebeat.yml

Filebeat 进程日志
filebeat 本身运行日志默认位置 /usr/local/filebeat/logs/filebeat
要修改 Filebeat 的日志路径,可以添加如下内容在配置文件 filebeat.yml 中实现

# ================================== Logging ===================================
# Sets log level. The default log level is info.
# Available log levels are: error, warning, info, debug
#logging.level: debug
path.logs: /var/log/   # 添加此行即可

这样设置后, filebeat 启动后,日志的目录是 /var/log/ , 日志的文件名为 filebeat , 每次启动或者重启程序会生
成一个新的日志文件 filebeat , 旧的日志命名为 filebeat.1 依次类推。

4.3 专用日志搜集模块
查看可启用的模块列表
[root@es-03 ~]# /usr/local/filebeat/filebeat -c /usr/local/filebeat/filebeat.yml modules list
Enabled:
nginx
Disabled:
activemq
apache
auditd

模块配置文件存储位置
[root@es-03 modules.d]# pwd
/usr/local/filebeat/modules.d
[root@es-03 modules.d]# ls
......

禁用模块
[root@es-03 modules.d]# /usr/local/filebeat/filebeat -c /usr/local/filebeat/filebeat.yml modules disable 模块名

启用模块
[root@es-03 modules.d]# /usr/local/filebeat/filebeat -c /usr/local/filebeat/filebeat.yml modules enable 模块名

情景 1:使用模块默认的日志路径

修改 modules.d/nginx.yml文件内容如下:

‐ module: nginx
  access:
    enabled: true
  error:
    enabled: true

nginx 模块搜集日志的默认路径是 :
/var/log/nginx/access.log*
/var/log/nginx/error.log*

情景 2:使用非默认路径(适用于所有的模块)
假如所要搜集的日志真实路径和日志收集模块默认的路径不一致,可以配置 var.paths: 属性进行配置。

var.paths
接收的值是一个包含一个以上的日志绝对路径列表。接收的值是一个数组

用于给日志文件设置自定义路径的。如果不设置此选项, Filebeat 将根据您的操作系统选择路径选择使用默认值
可以使用如下方式配置:
‐ module: nginx
  access:
    enabled: true
    var.paths: ["/data/nginx/log/nginx/access.log*", "/data/nginx/log/error.log*"]

或者下面的方式 :
‐ module: nginx
  access:
    enabled: true
    var.paths:
      ‐ "/data/nginx/log/nginx/access.log*"
      ‐ "/data/nginx/log/error.log*"   

⚠ 注意: var.paths 指定的路径,是以追加的方式和模块默认路径合并到一起的,也就是说假如模块的默认路径有
具体的日志文件 /var/log/nginx/access.log 。 这里 var.paths 也配置了路径 /tmp/accesslog ,那么最终
Filebeat 收集的日志路径将会是 :

/var/log/nginx/access.log
/tmp/accesslog
测试:调用模块进行测试:./filebeat -e

配置 output
Filebeat 是用于搜集日志,之后把日志推送到某个接收的系统中的,这些系统或者装置在 Filebeat 中称为output

output 类型 :
console 终端屏幕
elasticsearch 存放日志,并提供查询
logstash 进一步对日志数据进行处理
kafka 消息队列
⚠ filebeat 运行的时候,以上的 output 只可配置其中的一种。

具体配置方式是编辑主配置文件 : /usr/local/filebeat/filebeat.yml

注意:注释掉其他的 output
输出到 console
输出完整 JSON 数据
‐ module: nginx
  access:
    enabled: true
    var.paths: ["/data/nginx/log/nginx/access.log*", "/data/nginx/log/error.log*"]
==========================================================
‐ module: nginx
  access:
    enabled: true
    var.paths:
      ‐ "/data/nginx/log/nginx/access.log*"
      ‐ "/data/nginx/log/error.log*"   
output.console:
  pretty: true

进入到 filebeat 的安装目录下,执行命令前台运行./filebeat

如果只想输出完整 Json 数据中的某些字段
output.console:
  codec.format:
    string: '%{[@timestamp]} %{[message]}'

其他输出目标:
输出到 elasticsearch

output.elasticsearch:
  hosts: ['http://192.168.15.77:9200', 'http://192.168.15.78:9200']

输出到 logstash

output.logstash:
  hosts: ["192.168.15.78:5044"]

5、部署Logstash
5.1 安装logstash
[root@es-02 ~]# wget https://artifacts.elastic.co/dow ... linux-x86_64.tar.gz
[root@es-02 ~]# tar zxf logstash-7.13.2-linux-x86_64.tar.gz  -C /usr/local/
[root@es-02 ~]# mv /usr/local/logstash-7.13.2 /usr/local/logstash

5.2 测试运行
运行最基本的 Logstash 管道来测试 Logstash 安装。

Logstash 管道具有两个必需元素 input 和output ,以及一个可选元素 filter 。输入插件使用来自源的数据,过滤器插件根据你的指定修改数据,输出插件将数据写入目标。
进入 Logstash 的安装主目录下执行:[root@lognode1 logstash]# ./bin/logstash -e ""

-e 选项用于设置 Logstash 处理数据的输入和输出
-e '' 等同于 -e input { stdin { type => stdin } } output { stdout { codec => rubydebug } }
input { stdin { type => stdin } }
表示 Logstash 需要处理的数据来源来自于标准输入设备
output { stdout { codec => rubydebug } }
表示 Logstash 把处理好的数据输出到标准输出设备

稍等片刻,当看到屏幕上输出如下字样,即可尝试使用键盘输入 hello 字样
[2021-08-15T07:37:10,525][INFO ][logstash.agent ] Successfully started Logstash API endpoint {:port=>9600}

输入 hello 即会立刻输出配格式化后的数据信息,如下图:
hello
{
    "@timestamp" => 2022-06-07T07:01:55.312547Z,
          "host" => {
        "hostname" => "lognode1.localdomain"
    },
         "event" => {
        "original" => "hello"
    },
          "type" => "stdin",
       "message" => "hello",
      "@version" => "1"
}

说明:
message 字段对应的值是 Logstash 接收到的一行完整的数据
@version是版本信息,可以用于建立索引使用
@timestamp 处理此数据的时间戳,可以用于建立索引和搜索
type就是之前input中设置的值,这个值可以任意修改,但是, type 是内置的变量,不能修改,用于建立索引和条件判断等
hosts表示从那个主机过来的数据

5.3 配置输入和输出
生产中, Logstash 管道要复杂一些:它通常具有一个或多个输入,过滤器和输出插件。
本部分中,将创建一个 Logstash 管道,该管道使用标准输入来获取 Apache Web 日志作为输入,解析这些日志以从
日志中创建特定的命名字段,然后将解析的数据输出到标准输出(屏幕上)。并且这次无需在命令行上定义管道配
置,而是在配置文件中定义管道。
创建任意一个文件,并写入如下内容,作为 Logstash 的管道配置文件
[root@es-02 logstash]# vim /usr/local/logstash/config/first -pipeline.conf
input {
    stdin { }
}
output {
    stdout {}
}

配置文件语法测试
bin/logstash ‐f config/first‐pipeline.conf ‐‐config.test_and_exit 或 -t

-f 用于指定管道配置文件。
运行如下命令启动 Logstash

[root@es-02 logstash]# bin/logstash ‐f config/first‐pipeline.conf

启动后复制如下内容到命令行中,并按下回车键
使用 Grok 过滤器插件解析 Web 日志
现在有了一个工作管道,但是日志消息的格式不是理想的。你想解析日志消息 ,以便能从日志中创建特定的命名字段。为此,应该使用 grok 过滤器插件。

使用 grok 过滤器插件,可以将非结构化日志数据解析为结构化和可查询的内容。
grok 会根据你感兴趣的内容分配字段名称,并把这些内容和对应的字段名称进行绑定。

这里使用的模式是 %{COMBINEDAPACHELOG}
{COMBINEDAPACHELOG 使用以下模式从 Nginx 日志中构造行:

并且这里要想实现修改配置文件之后自动加载它,不能配置 input为stdin 。 所以, 这里使用了file ,创建示例日志文件

56.32.126.78 - - [04/Jun/2021:16:28:22 +0800] "OST /a/gsg HTTP/1.1" "-" 200 22062 "https://xxxx.com/index" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)Chrome/90.0.4430.212 Safari/537.36" "-" "192.168.0.75:1820" "0.090" 0.090

修改好的管道配置文件如下:

[root@es-02 logstash]# vim config/first-pipeline.conf
input {
  file {
    path => ["/data/logs/nginx/access.log"]
    start_position => "beginning"
  }
}
filter {
  grok {   #  对 web  日志进行过滤处理,输出结构化的数据
    #  在 message  字段对应的值中查询匹配上  COMBINEDAPACHELOG
    match => { "message" => "%{COMBINEDAPACHELOG}"}  
  }
}
output {
  stdout {}
}

match => { "message" => "%{COMBINEDAPACHELOG}"}的意思是: 当匹配到 “message” 字段时,用户模式
"COMBINEDAPACHELOG}"进行字段映射。

配置完成后,再次进行验证
[root@es-02 logstash]# ./bin/logstash -f config/first-pipeline.conf

下面输出的内容
会发现原来的非结构化数据,变为结构化的数据了。

原来的 message 字段仍然存在,假如你不需要它,可以使用 grok 中提供的常用选项之一:
remove_filed 来移除这个字段。 remove_field 可以移除任意的字段,它可以接收的值是一个数组。

rename 可以重新命名字段

修改后管道配置文件如下:

[root@es-02 logstash]# cat /usr/local/logstash/config/first-pipeline.conf
input {
  file {
    path => ["/data/logs/nginx/access.log"]
    start_position => "beginning"   
  }
}
filter {
  grok { match => { "message" => "%{COMBINEDAPACHELOG}"} }
  # 重写字段
  mutate { rename => { "clientip" => "cip" } }
  # 去掉没用字段
  mutate { remove_field => ["message","input_type","@version","@timestamp"] }
}
output {
  stdout {}

增加新日志,再次测试,你会发现 message 不见了 ,而且 clientip 重命名成了 cip :


5.4 配置logstash从filebeat 读取数据存储到es集群
[root@es-02 logstash]# cat config/first-pipeline.conf
input {
#  file {
#    path => ["/data/logs/nginx/access.log"]
#    start_position => "beginning"   
#  }
  beats {
    port => 5044
  }
}
filter {
  grok { match => { "message" => "%{COMBINEDAPACHELOG}"} }
# mutate { rename => { "clientip" => "cip" } }
#  mutate { remove_field => ["message","input_type","@version","@timestamp"] }
}
output {
  stdout {
    codec => rubydebug
  }
if [log][file][path] == "/data/logs/nginx/access.log" {
   elasticsearch {
      hosts => ["192.168.15.77:9200","192.168.15.78:9200","192.168.15.79:9200"]
      index => "%{[host][hostname]}‐nginx‐access-%{+YYYY.MM.dd}"
      codec => "json"
   }
  } else if [log][file][path] == "/data/logs/nginx/error.log" {
    elasticsearch {
       hosts => ["192.168.15.77:9200","192.168.15.78:9200","192.168.15.79:9200"]
       index => "%{[host][hostname]}‐nginx‐error-%{+YYYY.MM.dd}"
       codec => "json"
     }
    }
}

5.5 启动logstash并观察日志
[root@es-02 logstash]# ./bin/logstash -f config/first-pipeline.conf  --config.reload.automatic
观察日志的输出,已经从filebeat读取了数据并存到了es集群中


5.6 查看elasticsearch集群是否增加了对应的索引库
es集群已经生成了es-03‐nginx‐error-2021.08.23及es-03‐nginx‐access-2021.08.23索引库

到此为止logstash已经成功从filebeat读取到日志数据,然后传入到elasticsearch集群不同的索引库


6、在kibana上关联elasticsearch索引库浏览日志数据
6.1 在kibana上添加nginx-access索引模式
使用浏览器访问 http://192.168.15.78:5601


6.1.1 创建索引模式
6.1.2 填写索引名
6.1.3 添加一个时间筛选字段
6.1.4 创建成功
6.2 查询nginx-access索引日志数据



--------------------------------------------------------------

安装 elasticsearch
lscpu 查看系统架构
image
下载相应版本的 elasticsearch https://www.elastic.co/cn/downloads/elasticsearch
image
创建用户elastic useradd elastic 上传安装包到 /home/elastic/ 目录下
解压,修改配置文件,启动
tar -zxvf elasticsearch-7.12.1-linux-x86_64.tar.gz
cd elasticsearch-7.12.1/
vim config/elasticsearch.yml
# 修改如下内容
cluster.name: zmzhou-132-elk
node.name: es-node-1
path.data: /home/elastic/elasticsearch-7.12.1/data
path.logs: /home/elastic/elasticsearch-7.12.1/logs
bootstrap.memory_lock: false
bootstrap.system_call_filter: false
network.host: 0.0.0.0
http.port: 9200
discovery.seed_hosts: ["127.0.0.1", "zmzhou-132-elk"]
cluster.initial_master_nodes: ["es-node-1"]
# 修改文件夹所属用户权限
chown -R elastic:elastic /home/elastic/
# 切换用户
su - elastic
cd elasticsearch-7.12.1/
# 后台启动
./bin/elasticsearch -d
报错以及解决办法
报错1 JAVA_HOME is deprecated, use ES_JAVA_HOME
image
vim /etc/profile
export ES_JAVA_HOME=/home/elastic/elasticsearch-7.12.1/jdk
source /etc/profile
报错2 ERROR: bootstrap checks failed
[2] bootstrap checks failed. You must address the points described in the following [2] lines before starting Elasticsearch.
bootstrap check failure [1] of [2]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
bootstrap check failure [2] of [2]: the default discovery settings are unsuitable for production use; at least one of [discovery.seed_hosts, discovery.seed_providers, cluster.initial_master_nodes] must be configured
解决:[1]编辑 sysctl.conf 添加如下配置

# echo "vm.max_map_count=262144" >> /etc/sysctl.conf
# sysctl -p  #使修改立即生效
[2]在elasticsearch.yml中加上如下配置:

discovery.seed_hosts: ["127.0.0.1", "zmzhou-132-elk"]
cluster.initial_master_nodes: ["es-node-1"]
报错3 ERROR: bootstrap checks failed
max file descriptors [4096] for elasticsearch process likely too low, increase to at least [65536]
max number of threads [1024] for user [elastic] likely too low, increase to at least [2048]
解决:[1] 切换到root用户,编辑limits.conf 根据错误提示添加如下内容:

vim /etc/security/limits.conf
#添加如下内容
* soft nofile 65536
* hard nofile 131072
* soft nproc 2048
* hard nproc 4096
[2]编辑 90-nproc.conf 修改配置

vim /etc/security/limits.d/90-nproc.conf
#修改为
* soft nproc 2048
报错4 bootstrap checks failed
bootstrap checks failed
system call filters failed to install; check the logs and fix your configuration or disable system call filters at your own risk
解决:在elasticsearch.yml中加上如下配置:

bootstrap.memory_lock: false
bootstrap.system_call_filter: false
查看日志 tail -100f /home/elastic/elasticsearch-7.12.1/logs/zmzhou-132-elk.log, 启动成功如下:
image

image
安装 Logstash
下载相应版本的 Logstash https://www.elastic.co/cn/downloads/logstash
image
解压,修改配置文件
tar -zxvf logstash-7.12.1-linux-x86_64.tar.gz
cd logstash-7.12.1/
cp config/logstash-sample.conf config/logstash.conf
vim startup.sh
#编辑如下内容,保存退出
#!/bin/bash
nohup ./bin/logstash -f config/logstash.conf &
chmod +x startup.sh
vim config/logstash.conf 添加配置如下

input {
  beats {
    port => 5044
  }
  tcp {
    mode => "server"
    host => "0.0.0.0"  # 允许任意主机发送日志
    type => "elk1"      # 设定type以区分每个输入源
    port => 4567      
    codec => json_lines   # 数据格式
  }
}
output {
  if [type] == "elk1" {
    elasticsearch {
      action => "index"          # 输出时创建映射
      hosts  => "192.168.163.132:9200"   # ElasticSearch 的地址和端口
      index  => "elk1-%{+YYYY.MM.dd}"         # 指定索引名
      codec  => "json"
     }
  }
}
启动 logstash
./startup.sh
#查看日志
tail -100f nohup.out
安装 Kibana
下载相应版本的 Kibana https://www.elastic.co/cn/downloads/kibana
image
解压,修改配置文件,启动
tar -zxvf kibana-7.12.1-linux-x86_64.tar.gz
cd kibana-7.12.1-linux-x86_64/
vim config/kibana.yml
#修改如下内容:
server.port: 5601
server.host: "0.0.0.0"
server.name: "zmzhou-132-elk"
elasticsearch.hosts: ["http://localhost:9200"]
kibana.index: ".kibana"
i18n.locale: "zh-CN"
# 后台启动
nohup ./bin/kibana &
启动成功访问:http://192.168.163.132:5601/
image
springboot + logback 输出日志到 logstash
添加 logstash 依赖 pom.xml
<!-- https://mvnrepository.com/artifa ... ash-logback-encoder -->
<dependency>
  <groupId>net.logstash.logback</groupId>
  <artifactId>logstash-logback-encoder</artifactId>
  <version>6.6</version>
</dependency>
修改 application.yml,添加配置
logstash:
  address: 192.168.163.132:4567
修改 logback-spring.xml 配置
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!-- logstash地址,从 application.yml 中获取-->
    <springProperty scope="context" name="LOGSTASH_ADDRESS" source="logstash.address"/>
    <springProperty scope="context" name="APPLICATION_NAME" source="spring.application.name"/>
    <!--日志在工程中的输出位置-->
    <property name="LOG_FILE" value="/opt/web-shell/logging"/>
    <!-- 彩色日志依赖的渲染类 -->
    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
    <conversionRule conversionWord="wex"
                    converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
    <conversionRule conversionWord="wEx"
                    converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
    <!--控制台的日志输出样式-->
    <property name="CONSOLE_LOG_PATTERN"
              value="%clr(%d{HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr({faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
    <!-- 控制台输出 -->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>
        <!-- 日志输出编码 -->
        <encoder>
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>utf8</charset>
        </encoder>
    </appender>
    <!--文件-->
    <appender name="fileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 多JVM同时操作同一个日志文件 -->
        <rudent>false</Prudent>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>
                ${LOG_FILE}.%d{yyyy-MM-dd}.log
            </FileNamePattern>
            <!-- 日志最大的历史 10天 -->
            <maxHistory>10</maxHistory>
        </rollingPolicy>
        <layout class="ch.qos.logback.classic.PatternLayout">
            <attern>
                %d{yyyy-MM-dd HH:mm:ss} %-5level logger{39} -%msg%n
            </Pattern>
        </layout>
    </appender>
    <!--输出到logstash的appender-->
    <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <!--可以访问的logstash日志收集端口-->
        <destination>${LOGSTASH_ADDRESS}</destination>
        <encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
            <providers>
                <timestamp>
                    <timeZone>Asia/Shanghai</timeZone>
                </timestamp>
                <pattern>
                    <pattern>
                        {
                        "app": "${APPLICATION_NAME}",
                        "level": "%level",
                        "thread": "%thread",
                        "logger": "%logger{50} %M %L ",
                        "message": "%msg"
                        }
                    </pattern>
                </pattern>
                <stackTrace>
                    <throwableConverter class="net.logstash.logback.stacktrace.ShortenedThrowableConverter">
                        <maxDepthPerThrowable>100</maxDepthPerThrowable>
                        <rootCauseFirst>true</rootCauseFirst>
                        <inlineHash>true</inlineHash>
                    </throwableConverter>
                </stackTrace>
            </providers>
        </encoder>
    </appender>
    <root level="INFO">
        <appender-ref ref="console"/>
        <appender-ref ref="fileAppender"/>
        <appender-ref ref="LOGSTASH"/>
    </root>
</configuration>
springboot + log4j2 异步输出日志到 logstash
修改 log4f2.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出-->
<!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数-->
<configuration status="warn" name="web-shell" monitorInterval="300">
  <properties>
    <property name="LOG_HOME">/opt/web-shell/logs</property>
    <property name="maxHistory">7</property>
    <!-- 这个都知道是输出日志的格式 -->
    <property name="pattern">%d{yyyy-MM-dd HH:mm:ss z} [%thread] %-5level %class{36} [%M:%L] - %msg%xEx%n</property>
    <property name="console_pattern">%d{HH:mm:ss.SSS} [%thread] %-5level %class{36} [%M:%L] - %msg%xEx%n</property>
    <property name="logstash_pattern">{"app": "web-shell", "level": "%level", "message": "%thread %M %L - %msg%xEx%n"}</property>
  </properties>
  <!--先定义所有的appender -->
  <appenders>
    <!--这个输出控制台的配置 -->
    <Console name="Console" target="SYSTEM_OUT">
      <!-- 控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) -->
      <ThresholdFilter level="trace"/>
      <atternLayout pattern="${console_pattern}"/>
    </Console>
    <!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,这个也挺有用的,适合临时测试用 -->
    <!--append为TRUE表示消息增加到指定文件中,false表示消息覆盖指定的文件内容,默认值是true -->
    <File name="log" fileName="${LOG_HOME}/log4j2.log" append="false">
      <atternLayout pattern="${console_pattern}"/>
      <ThresholdFilter level="warn"/>
    </File>
    <!-- 打印出所有的error信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档 -->
    <RollingFile name="errorRollingFile" fileName="${LOG_HOME}/error.log"
                 filePattern="${LOG_HOME}/$${date:yyyy-MM}/%d{yyyy-MM-dd}-error-%i.log.gz">
      <atternLayout pattern="${pattern}"/>
      <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
      <ThresholdFilter level="error"/>
      <olicies>
        <TimeBasedTriggeringPolicy/>
        <SizeBasedTriggeringPolicy size="100 MB"/>
      </Policies>
      <DefaultRolloverStrategy max="${maxHistory}"/>
    </RollingFile>
    <!-- 打印出所有的warn信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档 -->
    <RollingFile name="warnRollingFile" fileName="${LOG_HOME}/warn.log"
                 filePattern="${LOG_HOME}/$${date:yyyy-MM}/%d{yyyy-MM-dd}-warn-%i.log.gz">
      <atternLayout pattern="${pattern}"/>
      <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
      <ThresholdFilter level="warn"/>
      <olicies>
        <TimeBasedTriggeringPolicy/>
        <SizeBasedTriggeringPolicy size="100 MB"/>
      </Policies>
      <DefaultRolloverStrategy max="${maxHistory}"/>
    </RollingFile>
    <!-- 打印出所有的info信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档 -->
    <RollingFile name="infoRollingFile" fileName="${LOG_HOME}/info.log"
                 filePattern="${LOG_HOME}/$${date:yyyy-MM}/%d{yyyy-MM-dd}-info-%i.log.gz">
      <PatternLayout pattern="${pattern}"/>
      <ThresholdFilter level="info"/>
      <Policies>
        <TimeBasedTriggeringPolicy/>
        <SizeBasedTriggeringPolicy size="100 MB"/>
      </Policies>
      <DefaultRolloverStrategy max="${maxHistory}"/>
    </RollingFile>
    <!-- 和logstash建立Socket连接 -->
    <Socket name="logstash" host="192.168.163.132" port="4567" protocol="TCP">
      <PatternLayout pattern="${logstash_pattern}" />
    </Socket>
  </appenders>
  <!--然后定义logger,只有定义了logger并引入的appender,appender才会生效 -->
  <loggers>
    <!--过滤掉spring和hibernate的一些无用的DEBUG信息-->
    <logger name="org.hibernate" level="INFO"/>
    <logger name="org.springframework" level="INFO"/>
    <!-- 日志输出到logstash -->
    <logger name="com.github.zmzhoustar" level="info" includeLocation="false" >
      <appender-ref ref="logstash" />
    </logger>
    <root level="INFO">
      <appender-ref ref="Console"/>
      <appender-ref ref="log"/>
      <appender-ref ref="infoRollingFile"/>
      <appender-ref ref="warnRollingFile"/>
      <appender-ref ref="errorRollingFile"/>
    </root>
  </loggers>
</configuration>
本项目地址: https://gitee.com/zmzhou-star/web-shell
测试,启动spring boot项目,访问 http://192.168.163.132:5601/
创建索引,我们之前在 logstash 配置的索引规则是以 elk1 开头:
image
筛选我们的应用名
image

image
至此,我们的ELK环境已经搭好啦,不过还有更多功能等待解锁,比如 Beats等,整个软件目录如下
image
设置Nginx反向代理账号密码访问

JVM Support Matrix https://www.elastic.co/cn/support/matrix#matrix_jvm

防火墙相关命令
# 启动:
systemctl start firewalld
# 查看状态:
systemctl status firewalld
firewall-cmd --state
# 停止:
systemctl disable firewalld
#禁用:
systemctl stop firewalld
#查看所有打开的端口
firewall-cmd --zone=public --list-ports
#添加一个端口
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --zone=public --add-port=4567/tcp --permanent
firewall-cmd --zone=public --add-port=5601/tcp --permanent
#删除一个端口
firewall-cmd --zone=public --remove-port=80/tcp --permanent
#更新防火墙规则
firewall-cmd --reload

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|RuZhuo ( 鄂ICP备16015978号-8 )

GMT+8, 2024-5-19 05:09 , Processed in 0.029690 second(s), 28 queries .

Powered by RuZhuo

快速回复 返回顶部 返回列表