PHP开源Hub
致力于开发者的提升

使用 ELK 搭建日记系统

简介

搭建日志系统的目的主要为了在生产环境下能够方便的查看多个项目的实时日记,增加开发效率。特别是在线上多台服务器部署时候,不用在登录服务器进入项目目录,通过 tail -f 等命令来查看日记了。

目标

  • 使用 ELK ( Elasticsearch、Logstash、Kibana ) 构建日记系统。
  • 实现多台服务器收集 Laravel 应用日记与 Nginx 日记。
  • Kibana 报表的展示日记信息。

架构

Filebeat + Redis + ELK ( Elasticsearch、Logstash、Kibana )

使用ELK搭建日记

  1. Filebeat 从服务器取日志文件并存储到 Redis 中。
  2. Logstash 从 Redis 中取出日志记录,解析处理后并转发到 Elasticsearch 中。
  3. Kibana 从 Elasticsearch 中读取数据并展示。

    配置

    Filebeat

  • 安装
    下载程序并安装, 也可查看 官网 教程
    deb:

    $ curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.7.0-amd64.deb
    $ sudo dpkg -i filebeat-7.7.0-amd64.deb

    配置开机启动:

    $ sudo systemctl enable filebeat
  • filebeat.yml 编辑配置文件
    input 部分编辑

    $ vim /etc/filebeat/filebeat.yml

    filebeat.yml

.
.
.
filebeat.inputs:
- type: log
  paths:
    - /home/vagrant/code/laravel-shop/storage/logs/laravel.log
  multiline.pattern: '^\[[0-9]{4}-[0-9]{2}-[0-9]{2}'
  multiline.negate: true
  multiline.match: after
  multiline.timeout: 5s
  scan_frequency: 5s
  fields:
          index: 'laravel-log'


- type: log
  paths:
    - /var/log/nginx/deploy-laravel-shop-error.log

  multiline.pattern: '^[0-9]{4}/[0-9]{2}/[0-9]{2}'
  multiline.negate: true
  multiline.match: after
  multiline.timeout: 5s
  scan_frequency: 5s
  fields:
          index: 'deploy-laravel-shop-error.log'
.
.
.

path: 为日志文件路径, 这里收集了 laravel, nginx 日记。
multiline.pattern: 正则表达式,匹配日记与 2020-06-01 为开头的记录为同一条日记记录。Filebeat 将所有不以 2020-06-01 开始的行与之前的行进行合并。
multiline.negate 与 multiline.match 配合使用。 multiline.pattern=^b 则以b开头的行是一条完整日志的开始,它和后面多个不以b开头的行组成一条完整日志。
multiline.timeout: timeout表示超时时间,如果超过timeout还没有新的一行日志产生,则自动结束当前的多行、形成一条日志发出去。
scan_frequency: Filebeat以多快的频率去prospector指定的目录下面检测文件更新(比如是否有新增文件),如果设置为0s,则Filebeat会尽可能快地感知更新(占用的CPU会变高)。默认是10s。

Outputs 部份

.
.
.
#========================== Outputs ===============================

# Configure what output to use when sending the data collected by the beat.
#-------------------------- Redis output -------------------------------------
output.redis:
# Array of hosts to connect to.
        hosts: ["172.18.34.23:6379"]
        enabled: true
        db: "1"
        timeout: 5
        password: "123456"
        key: "%{[fields.index]:otherIndex}"

.
.
.

hosts: 为局域网 redis 服务器的 ip.
key 为 redis 键值。
保存文件后重启 filebeat

$ sudo systemctl restart filebeat

验证 Filebeat 是否读取数据成功
登录 redis 查询是否有存在 key : laravel-log , deploy-laravel-shop-error .

$ redis-cli -h 172.18.34.23 -p 6379 
$ select 1
$ KEYS *
$ Llen laravel-log

使用 ELK 搭建日记
可以看到 KEY laravel-log, 且有 150485 条数据的存在。代表 Filebeat 运行成功。

Logstash

Logstash 从 Redis 中取出日志记录,解析处理后并转发到 Elasticsearch 中。

安装

$ curl -L -O https://artifacts.elastic.co/downloads/logstash/logstash-7.7.0.deb
$ sudo dpkg -i logstash-7.7.0.deb

新建数据流配置文件

$ vim /etc/logstash/conf.d/laravel-log.conf
# 从redis将数据取出
input {
  redis {
    type => "laravel_log"
    host => "127.0.0.1"
    port => "6379"
    db => "1"
    data_type => "list"
    key => "laravel-log"
  }
}

# 格式化laravel日志
filter {
   grok {
        match => [ "message","\[%{TIMESTAMP_ISO8601:logtime}\] %{WORD:env}\.(?<level>[A-Z]{4,5})\: %{GREEDYDATA:msg}" ]
        }
}

# 输出到elasticsearch
output {
    elasticsearch {
        hosts => ["172.18.34.23:9200"]
        index => "laravel_log"
    }
}

grok 对是laravel 日记的格式化,按正则表达式的语法来写的。
output 是 ES对应的配置, 在这里 redisES 都在本机。

如果要配置nginx日记收集,只需与相同的方式在conf.d目录新建
xxx.conf文件

# nginx error grok 格式
filter {
   grok {
        match => [ "message","(?<time>\d{4}/\d{2}/\d{2}\s{1,}\d{2}:\d{2}:\d{2})\s{1,}\[%{DATA:err_severity}\]\s{1,}(%{NUMBER:pid:int}#%{NUMBER}:\s{1,}\*%{NUMBER}|\*%{NUMBER}) %{DATA:err_message}(?:,\s{1,}client:\s{1,}(?<client_ip>%{IP}|%{HOSTNAME}))(?:,\s{1,}server:\s{1,}%{IPORHOST:server})(?:, request: %{QS:request})?(?:, host: %{QS:client_ip})?(?:, referrer: \"%{URI:referrer})?" ]
        }
}

保存后重启.

$ sudo systemctl restart logstash.service

Elasticsearch

安装

$ curl -L -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.8.9-linux-x86_64.tar.gz
$ tar -xvf elasticsearch-6.8.9-linux-x86_64.tar.gz

进入bin文件启动elasticsearch

$ cd elasticsearch-6.8.9/bin
$ ./elasticsearch

验证Elasticsearch是否安装成功

$ curl http://172.18.34.23:9200

成功信息如下:
使用 ELK 搭建日记

Kibana

Kibana 读取elasticsearch中的数据并展示成报表的形式。

安装

注:需要注意Kibana的版本只能低于或等于ES的版本否则有可能 出错。

下载并安装

$ wget https://artifacts.elastic.co/downloads/kibana/kibana-6.8.9-amd64.deb
$ shasum -a 512 kibana-6.8.9-amd64.deb 
$ sudo dpkg -i kibana-6.8.9-amd64.deb

配置kibana文件

$ vim /etc/kibana/kibana.yml
.
.
.
server.host: "0.0.0.0"
elasticsearch.hosts: ["http://172.18.34.23:9200"]
logging.dest: /var/log//kibana/kibana.log
i18n.locale: "zh-CN"
.
.
.

server.host设置成 0.0.0.0 是为了外网访问。
i18n.locale: "zh-CN":设置kibana的语言为中文。
logging.dest设置日记文件路径,注意 如果目录文件不存需要自行创建目录和文件并且分配好权限,否则kibana启动失败。

$ mkdir /var/log/kibana
$ touch /var/log/kibana/kibana.log
$ chown kibana:kibana /var/log/kibana/kibana.log

启动kibana

$sudo systemctl start kibana

如果服务器使用的是阿里云则需要打开 5601 端口。

使用 ELK 搭建日记系统

在浏览器中输入http://IP:5601就可以访问kibana

使用 ELK 搭建日记系统

Kibana 日记管理

创建日记空间
左侧菜单–>Default–>管理空间–>创建空间, 名称为 Larave Log.

使用 ELK 搭建日记系统

创建完成后,切换到LL空间下

使用 ELK 搭建日记系统

创建日记索引
左侧菜单 管理–> Kibana/索引模式 在右侧索引模式输入laravel_log, 选择下一步

使用 ELK 搭建日记系统

使用 ELK 搭建日记系统

使用 ELK 搭建日记系统

查看日记报表
创建完成后点击 左侧菜单Discover会展示出我们统计的日记报表

使用 ELK 搭建日记系统

左侧可选项可用来显示日记要选择的字段。

ELK 日记系统配置完成。

原文链接:https://learnku.com/articles/45524

赞(0) 打赏
未经允许不得转载PHP开源Hub » 使用 ELK 搭建日记系统

评论 1

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. #1

    陌陌

PHP开源Hub-致力于互联网开发者的成长

技术群聊软文发表

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏