在 Laravel 中,可以使用 Laravel 的 Log 驱动程序来将日志推送到 Logstash,而 Logstash 可以使用 TCP 协议来接收日志数据。以下是如何配置 Laravel 日志系统以将日志推送到 Logstash 的步骤:
1、安装 Logstash 驱动程序:
/*
首先,需要安装一个适用于 Logstash 的 Laravel 日志驱动程序。
一个常用的驱动程序是 "php-logstash"
驱动程序。你可以使用 Composer 来安装它:
*/
composer require monolog/monolog
composer require maxim-krasnyansky/php-logstash
2、配置 Laravel 日志通道:
/*
打开 Laravel 项目的 config/logging.php 文件
然后在 'channels' 配置数组中添加一个新的通道配置,
以将日志发送到 Logstash。以下是一个示例配置:
*/
'logstash' => [
'driver' => 'custom',
'via' => \App\Logging\LogstashLogger::class,
'host' => env('LOGSTASH_HOST', '127.0.0.1'),
'port' => env('LOGSTASH_PORT', 5000),
],
在这个示例中,我创建了一个名为 'logstash' 的通道,并指定了 Logstash 服务器的主机和端口。可以根据你的实际情况修改这些配置。
3、创建自定义 LogstashLogger:
/*
需要创建一个自定义的 LogstashLogger 类,该类将负责将日志数据发送到 Logstash。
可以在 Laravel 项目的 app/Logging 目录下创建一个新的 PHP 文件,例如 LogstashLogger.php,并添加以下内容:
*/
<?php
namespace App\Logging;
use Monolog\Handler\SocketHandler;
use Monolog\Logger;
class LogstashLogger
{
public function __invoke(array $config)
{
$handler = new SocketHandler("tcp://{$config['host']}:{$config['port']}");
$handler->setFormatter(new \Monolog\Formatter\LogstashFormatter(config('app.name')));
return new Logger($config['name'] ?? 'logstash', [$handler]);
}
}
此代码创建了一个 LogstashLogger 类,该类将通过 TCP 连接将日志数据发送到 Logstash 服务器。确保根据之前在配置文件中指定的主机和端口进行配置。
4、更新 .env 文件:
//在项目的 .env 文件中,设置 Logstash 服务器的主机和端口。例如:
LOGSTASH_HOST=your-logstash-host
LOGSTASH_PORT=your-logstash-port
5、使用 Logstash 日志通道:
Log::channel('logstash')->info('xiaowu test laravel log to logstash');
6、修改logstash(具体配置可以查看我之前发布的同步文章链接: 文章地址 )
input {
tcp {
type => "tcp"
host => "0.0.0.0"
port => 4900 # 这里的端口号要和之前 Laravel 配置中的一致
}
}
output {
#这里也可以查看我之前的文章改成es
stdout {
codec => rubydebug
}
}
7、查看结果
8、如果laravel日志没有写入可以本地手动请求tcp查看是否正常
echo "nc test" | nc 127.0.0.1 4900
注意:如果出现记录相同的情况需要检查 /usr/share/logstash/pipeline下的文件
logstash的配置文件pipeline中的文件不是依据文件后缀进行判断该文件是否作为配置文件生效的。
如果pipeline目录下有logstash.conf和logstash.confbak,2个配置文件都会被启用。正确的做法是将logstash.confbak移除(或者移出去)