magium / request-firehose
一个简单的库,可以将请求元数据从多个来源推送到收集服务(如Redis)
Requires
- php: ^5.5 || ^7.0
Requires (Dev)
- mongodb/mongodb: ^1.4
- phpunit/phpunit: ^7.5
- predis/predis: ^1.1
Suggests
- mongodb/mongodb: Required for pushing to MongoDB
- predis/predis: Required for pushing to Redis
This package is auto-updated.
Last update: 2024-09-05 04:01:33 UTC
README
此库会附加到PHP请求,并在请求关闭时将请求元数据或日志条目发送到适配器,目前为Redis或Mongo,以便存储、处理或跟踪。它适用于集群系统,其中多台机器提供HTTP请求,并且通常用于devops希望有一个集中式位置用于监控或存储请求,以便与其他日志工具一起使用。
例如,如果您想 tail
和 grep
特定IP地址的日志,您可以部署Redis发布代码(见下文)并运行以下命令
stdbuf -oL redis-cli --raw subscribe ingestion | grep -v -E 'message|ingestion' | grep '127.0.0.1'
安装
composer install magium/request-firehose
使用
简介
在脚本中最早方便的时候调用 \Magium\RequestFirehose\RequestFirehose::getInstance()
。这通常是在 require_once 'vendor/autoload.php';
之后立即执行。
一旦您有了firehose的实例,您将需要为它配置一个适配器。最简单的例子是使用 Filesystem
适配器。
\Magium\RequestFirehose\RequestFirehose::getInstance()->setAdapter( new \Magium\RequestFirehose\Adapter\Filesystem\Filesystem('/tmp/logfile') );
就这样!它将注册自身为关闭函数,并在请求完成后写入适当的适配器。
如果您不使用Composer,或者使用与PSR-4不兼容的其他自动加载器,您可以包含 src/include.php
文件,它将加载所有源文件。
如果您使用Redis、MongoDB或其他不属于PHP核心的适配器,您可能需要安装它们的客户端库。请检查composer建议以获取支持的客户端。
查看 examples 目录中的一些示例。以下示例大多来自那里。
Redis
推送 (BLPOP)
/** * To watch this in action execute `redis-cli` and call `blpop ingestion`. Then run this file (`php push.php`). Use this method if you want to "persist" the data (ensure that you * don't miss any, or if you want to round-robin data processing. */ \Magium\RequestFirehose\RequestFirehose::getInstance()->setAdapter( new \Magium\RequestFirehose\Adapter\Redis\PushAdapter( new \Predis\Client('tcp://127.0.0.1:6379'), 'ingestion' ) );
发布/订阅 (SUBSCRIBE)
/** * To watch this in action execute `redis-cli` and call `subscribe ingestion`. Then run this file (`php publish.php`). Use this example if you do not want persistent data and/or * want multiple subscribers to watch the data. */ \Magium\RequestFirehose\RequestFirehose::getInstance()->setAdapter( new \Magium\RequestFirehose\Adapter\Redis\PublishAdapter( new \Predis\Client('tcp://127.0.0.1:6379'), 'ingestion' ) );
发布/订阅 /w 日志输出
如果您正在寻找可以简单地使用 tail
和 grep
的内容,这可能是一个不错的选择。
/** * To watch this in action execute `redis-cli` and call `subscribe ingestion`. Then run * `php -S 0.0.0.0:7777 publish_log_file.php`). Use this example if you do not want persistent data and/or * want multiple subscribers to watch the data, or if you want to tail the log file for your entire cluster you can * execute: * * stdbuf -oL redis-cli --raw subscribe ingestion | grep -v -E 'message|ingestion' */ \Magium\RequestFirehose\RequestFirehose::getInstance()->setAdapter( new \Magium\RequestFirehose\Adapter\Redis\PublishAdapter( new \Predis\Client('tcp://127.0.0.1:6379'), 'ingestion', 0, new \Magium\RequestFirehose\Filter\LogfileFilter() ) );
MongoDB
/** * To watch this in action log in to your MongoDB instance and execute this file. Once you have executed this file * check your mongo DB. You should see the results there. */ $client = new \MongoDB\Client(); $collection = $client->selectCollection('analysis', 'requests'); \Magium\RequestFirehose\RequestFirehose::getInstance()->setAdapter( new \Magium\RequestFirehose\Adapter\MongoDb\MongoDb( $collection ) );
文件系统
/** * Run this file (`php filesystem.php`). Run `tail -f /tmp/testfile` to watch the output. */ \Magium\RequestFirehose\RequestFirehose::getInstance()->setAdapter( new \Magium\RequestFirehose\Adapter\Filesystem\Filesystem('/tmp/testfile') );
聚合
也许有时您希望将数据推送到Redis以便跟踪日志,同时也将数据存储在Mongo中进行处理。您可以使用Aggregate适配器来完成此操作。
/** * To watch this in action execute `redis-cli` and call `subscribe ingestion`. Then run * `php -S 0.0.0.0:7777 publish_log_file.php`. Use this example if you want to watch your system by grepping * the Redis subscription output, but also want to store the requests in MongoDB for later analysis. * * stdbuf -oL redis-cli --raw subscribe ingestion | grep -v -E 'message|ingestion' * */ $aggregate = new \Magium\RequestFirehose\Adapter\Aggregate\AggregateAdapter(); $aggregate[] = new \Magium\RequestFirehose\Adapter\Redis\PublishAdapter( new \Predis\Client('tcp://127.0.0.1:6379'), 'ingestion', 0, new \Magium\RequestFirehose\Filter\LogfileFilter() ); $client = new \MongoDB\Client(); $collection = $client->selectCollection('analysis', 'requests'); $aggregate[] = new \Magium\RequestFirehose\Adapter\MongoDb\MongoDb( $collection ); \Magium\RequestFirehose\RequestFirehose::getInstance()->setAdapter($aggregate);