garbetjie / monolog-bigquery-handler
一个可配置的Monolog处理器,用于将日志写入BigQuery。
v1.4.0
2018-09-07 06:28 UTC
Requires
- php: >=7.0
- ext-json: *
- google/cloud-bigquery: ^1.4
- monolog/monolog: ^1.23
README
一个简单(且可配置)的Monolog处理器,用于将日志消息写入BigQuery,利用Google的google/cloud-bigquery PHP客户端。
安装
composer require garbetjie/monolog-bigquery-handler
需要PHP 7.0。
入门
处理器期望BigQuery数据集和表已经创建好 - 处理器不会创建它们。
您可以使用以下命令(使用BigQuery命令行工具)来创建一个最小的表,该表能够接受日志记录(用实际的$dataset和$table名称替换)
bq mk --schema="channel:string,message:string,level:integer,level_name:string,context:string,extra:string,datetime:timestamp" --time_partitioning_field="datetime" "$dataset.$table"
使用方法
只需创建BigQuery客户端的一个实例,并将其传递给处理器,同时传递要插入日志记录的数据集和表名称。
$bigQueryClient = new Google\Cloud\BigQuery\BigQueryClient(); $handler = new Garbetjie\Monolog\Handler\BigQueryHandler($bigQueryClient, 'dataset_name', 'table_name', $level = Logger::DEBUG, $bubble = true); $logger = new Monolog\Logger('channel', [$handler]); $logger->debug('debug message');
上面显示的使用方法将逐个发送每个消息。建议使用BufferHandler。这将确保日志消息被批量处理,并将发送日志消息所花费的时间缩短。
在确定要使用的缓冲区大小时,请确保您了解BigQuery中流式插入配额限制。如果达到这些限制中的任何一个,整个消息批次将失败。
以下是如何使用BufferHandler的示例
// Using a buffer handler to batch log messages. $bigQueryClient = new Google\Cloud\BigQuery\BigQueryClient(); $handler = new Garbetjie\Monolog\Handler\BigQueryHandler($bigQueryClient, 'dataset_name', 'table_name', $level = Logger::DEBUG, $bubble = true); $handler = new Monolog\Handler\BufferHandler($handler, $bufferLimit = 10); $logger = new Monolog\Logger('channel', [$handler]); $logger->debug('message 1'); $logger->debug('message 2'); $logger->debug('message 3');
自定义字段
可以随日志字段一起发送额外的自定义字段。这些自定义字段可以按以下方式添加
// Using custom fields $handler = new Garbetjie\Monolog\Handler\BigQueryHandler($bigQueryClient, 'dataset_name', 'table_name', $level = Logger::DEBUG, $bubble = true); $handler->setCustomField('field_name', 'field_value'); // Or $handler->setCustomField(['name' => 'value', 'other_name' => 'other_value']) $handler->removeCustomField('field_name'); // Or $handler->removeCustomField(['field_name', 'other_field_name']);
自定义字段值可以是任何可以被JSON编码的标量值,或者是以下值之一
callable: 可以传递任何callable,它将在日志记录发送到BigQuery之前执行。
映射字段
默认情况下,要插入的字段名称与日志记录结构相同。但是,如果您有与这些不同的BigQuery列名称,您可以映射日志记录字段名称到自己的列名称
$bigQueryClient = new Google\Cloud\BigQuery\BigQueryClient(); $handler = new Garbetjie\Monolog\Handler\BigQueryHandler($bigQueryClient, 'dataset_name', 'table_name', $level = Logger::DEBUG, $bubble = true); $handler->setFieldMapping(['datetime' => 'logged_at']); // The `datetime` log record field will now be saved to the `logged_at` column. $logger->debug('message 1');