使用 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.negatemultiline.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 日记系统配置完成。

本作品采用《CC 协议》,转载必须注明作者和本文链接
本帖由系统于 3年前 自动加精
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 26
wenqingzzz

收藏一下,我们用的阿里云的elk

3年前 评论
blankqwq

收藏一些,后期要用

3年前 评论

最近也准备用这个啦。谢谢

3年前 评论
colin_king

redis可以替换成mogodb吗

3年前 评论

为何不用 Filebeat 直接把日志推送到 ES 呢?经过 Redis + Logstash 是为了?

3年前 评论
zdg1992 3年前
GeorgeKing 3年前

为啥不直接丢到Elasticsearch?

3年前 评论
largezhou 3年前

我以为用docker-compose就完了

3年前 评论
zhanghaidi

nice

3年前 评论

我们现在用的也是自己的elk 用的还不太熟,但是也能感觉到看日志方便

3年前 评论

请问有没有遇到,kibana在在图形化界面创建不了索引模式的问题, 一直在等待,我的kibana和elasticsearch 版本都是7.1

3年前 评论
lizebo 3年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!