宁泽林_NiZerin - 互联网技术博客

  • PHP
  • Go
  • Java
  • Rust
  • Python
  • 交流群
  • 关于我
  • 留言版
  1. 首页
  2. PHP
  3. 正文

使用 ELK 搭建日记系统

2020年6月13日 2879点热度 0人点赞 1条评论

简介

搭建日志系统的目的主要为了在生产环境下能够方便的查看多个项目的实时日记,增加开发效率。特别是在线上多台服务器部署时候,不用在登录服务器进入项目目录,通过 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对应的配置, 在这里 redis, ES 都在本机。
如果要配置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

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: laravel php
最后更新:2020年6月13日

NiZerin

博主已经躺平了,后面很少会更新博客。

打赏 点赞
< 上一篇
下一篇 >

文章评论

  •         

    陌陌

    2020年6月14日
    回复
  • razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
    回复          取消回复

    分类
    • Angular
    • CSS3
    • docker
    • Flutter
    • git
    • Go
    • H5
    • Java
    • JavaScript
    • Laravel
    • linux
    • Node.js
    • PHP
    • Python
    • React
    • redis
    • Vue.js
    • windows
    • WordPress
    • 交流
    • 小程序
    • 工具
    • 网站公告
    标签聚合
    go wordpress flutter laravel php translations javascript vue
    友情链接
    • PHP函数字典
    • 宝塔运维特惠
    • 科学上网
    • 阿里云特惠

    COPYRIGHT © 2021 nizer.in. ALL RIGHTS RESERVED.

    Theme Kratos Made By Seaton Jiang