使用 ELK 搭建日记系统
简介
搭建日志系统的目的主要为了在生产环境下能够方便的查看多个项目的实时日记,增加开发效率。特别是在线上多台服务器部署时候,不用在登录服务器进入项目目录,通过 tail -f 等命令来查看日记了。
目标
- 使用 ELK ( Elasticsearch、Logstash、Kibana ) 构建日记系统。
- 实现多台服务器收集 Laravel 应用日记与 Nginx 日记。
- Kibana 报表的展示日记信息。
架构
Filebeat + Redis + ELK ( Elasticsearch、Logstash、Kibana )
- Filebeat 从服务器取日志文件并存储到 Redis 中。
- Logstash 从 Redis 中取出日志记录,解析处理后并转发到 Elasticsearch 中。
- 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 部分编辑
filebeat.yml$ vim /etc/filebeat/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
可以看到 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
成功信息如下:
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 端口。
在浏览器中输入http://IP:5601
就可以访问kibana
Kibana 日记管理
创建日记空间
左侧菜单–>Default
–>管理空间–>创建空间, 名称为 Larave Log.
创建完成后,切换到LL
空间下
创建日记索引
左侧菜单 管理–> Kibana/索引模式 在右侧索引模式
输入laravel_log
, 选择下一步
查看日记报表
创建完成后点击 左侧菜单Discover
会展示出我们统计的日记报表
左侧可选项可用来显示日记要选择的字段。
ELK 日记系统配置完成。
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: