应一个朋友要求重新玩一下搭建 ELK 做日志采集分析, 并结合 laravel 使用的例子.
一个应用 LNMP 架构的 laravel 项目, 会产生并且需要采集的日志数据有:
要做的是把这些日志按照类别提交到 elasticsearch 中. 在提交方式的选择上, elasticsearch 本身提供了 RESTful API, 通过官方提供的 sdk 可以很方便地在 PHP 中提交应用日志.
而其他类别的日志, 则可以通过 logstash 和 filebeat 进行采集提交. 但为了容错, 统一地将所有的日志写入到文件, 再使用 agent 进行采集.
所以简单整理一下方案:
要实现的目标是:
使用 filebeat 的目的是 logstash 比较迟资源, 而 filebeat 更轻量且内置了比较齐全的 input 模块. 但也有一个问题, filebeat 只支持在 output.elasticsearch 处设置索引名, 一个 filebeat 实例采集的 log 将提交到同一个索引下, 并根据 input 模块给文档不同的类型 (默认会使用 doc
作为类型) 并放入不同的子集中.
一个大概的效果就是:
{
"nginx": {
"access": {
"remote_ip": "127.0.0.1"
}
}
}
{
"mysql": {
"slow": {
"schema": "testing_db"
}
}
}
摘抄一下官网文档 类型和映射:
类型不适合 完全不同类型的数据 。如果两个类型的字段集是互不相同的,这就意味着索引中将有一半的数据是空的(字段将是 稀疏的 ),最终将导致性能问题。在这种情况下,最好是使用两个单独的索引。
正常情况下 nginx 的 access log 的数量会比其他几个日志多出很多, 但由于一个 filebeat 实例只能配置使用一个索引名称, 所以就划分为前者独立一个实例采集, 其他日志起另外一个实例采集.
一些版本的选择:
先准备好应用及搭建好运行环境, 配置好日志格式, 然后搭建 ELK. 动手吧 ~
创建一个 laravel 5.8 的项目, 并修改 logging 配置
# config/logging.php
return [
'channels' => [
'daily' => [
'driver' => 'daily',
'path' => storage_path('logs/laravel.log'),
'formatter' => \Monolog\Formatter\LogstashFormatter::class,
'level' => 'debug',
'days' => 14,
],
],
];
然后通过依赖容器给 LogstashFormatter::__constrcut()
注入 applicationName
:
# app/Providers/AppServiceProvider.php
public function register()
{
$this->app->when(LogstashFormatter::class)->needs('$applicationName')->give(function () {
return config('app.name');
});
}
server {
access_log /data/logs/nginx/laravel.access.log; # 这里暂不自定义日志格式, 使用默认的日志格式
error_log /data/logs/nginx/laravel.error.log;
}
long_query_time=2
slow_query_log=On
slow_query_log_file="/var/log/mysql/mysql_slow_query.log"
log_queries_not_using-indexes=On
因为其他屁事没写完.. 先随便上传上来了, 什么时候再补齐一下了.
#参考