popphp/pop-log

Pop PHP 框架的日志组件

4.0.0 2023-12-18 17:25 UTC

README

Build Status Coverage Status

Join the chat at https://popphp.slack.com Join the chat at https://discord.gg/TZjgT74U7E

概览

pop-log 是一个日志组件,它提供了一种按照 RFC-3164 中概述的 BSD syslog 协议记录事件的方式。支持将日志消息写入文件、数据库表或通过电子邮件或 HTTP 部署。可用的八个日志消息严重性值包括:

  • EMERG (0)
  • ALERT (1)
  • CRIT (2)
  • ERR (3)
  • WARN (4)
  • NOTICE (5)
  • INFO (6)
  • DEBUG (7)

它们分别通过相应的方法提供:

  • $log->emergency($message);
  • $log->alert($message);
  • $log->critical($message);
  • $log->error($message);
  • $log->warning($message);
  • $log->notice($message);
  • $log->info($message);
  • $log->debug($message);

pop-logPop PHP 框架 的一个组件。

顶部

安装

使用 Composer 安装 pop-log

composer require popphp/pop-log

或者,在您的 composer.json 文件中引入它

"require": {
    "popphp/pop-log" : "^4.0.0"
}

顶部

快速入门

这是一个使用文件写入器的基本示例

use Pop\Log\Logger;
use Pop\Log\Writer\File;

$log = new Logger(new File(__DIR__ . '/logs/app.log'));

$log->info('Just a info message');
$log->alert('Look Out! Something serious happened!');

然后,您的 'app.log' 文件将包含

2015-07-11 12:32:32    6    INFO    Just a info message
2015-07-11 12:32:33    1    ALERT   Look Out! Something serious happened!

顶部

作者

有四种可用的日志写入器,但其他写入器也可以创建,如果它们实现了 Pop\Log\Writer\WriterInterface

文件

文件日志写入器将日志输出简单地存储到磁盘上的日志文件中。日志文件格式源自日志文件名。支持的日志文件类型包括

  • 纯文本(.log.txt
  • CSV(.csv
  • TSV(.tsv
  • XML(.xml
  • JSON(.json
use Pop\Log\Logger;
use Pop\Log\Writer\File;

$log = new Logger(new File(__DIR__ . '/logs/app.csv'));

$context = [
    'name'      => 'my-log-entry',
    'timestamp' => date('Y-m-d H:i:s')
];

$log->info('Just a info message', $context);

上面的代码创建了一个包含日志条目的 CSV 文件

2023-10-31 15:58:28,6,my-log-entry,"Just a info message",

顶部

邮件

邮件日志写入器使用 popphp/pop-mail 组件通过电子邮件发送日志条目。构造函数需要一个 Pop\Mail\Mailer 对象,以及至少一个电子邮件作为第二个参数。可选的第三个参数允许您传递额外的电子邮件头信息,例如主题和 CC 地址。

use Pop\Log\Logger;
use Pop\Log\Writer\Mail;
use Pop\Mail\Mailer;
use Pop\Mail\Transport\Sendmail;

$emails  = ['sysadmin@mydomain.com', 'logs@mydomain.com'];
$options = [
    'subject' => 'Custom Log Entry:',
    'cc'      => 'another@mydomain.com'
];

$mailer = new Mailer(new Sendmail());
$log    = new Logger(new Mail($mailer, $emails, $options));

$log->info('Just a info message');
$log->alert('Look Out! Something serious happened!');

然后,上述列出的电子邮件将收到一系列这样的电子邮件

Subject: Custom Log Entry: INFO (6)
2023-11-11 12:32:32    6    INFO    Just a info message
Subject: Custom Log Entry: ALERT (1)
2023-11-11 12:32:33    1    ALERT   Look Out! Something serious happened!

顶部

数据库

将日志写入数据库表需要 popphp/pop-db 组件。数据库写入器构造函数需要一个 Pop\Db\Adapter\AbstractAdapter 实例,以及可选的 $table 参数(默认表名为 pop_log)。

use Pop\Db\Db;
use Pop\Log\Logger;
use Pop\Log\Writer\Database;

$db  = Db::connect('sqlite', __DIR__ . '/logs/.htapplog.sqlite');
$log = new Logger(new Database($db, 'system_logs'));

$log->info('Just a info message');
$log->alert('Look Out! Something serious happened!');

在这种情况下,日志被写入一个具有 idtimestamplevelnamemessage 列的数据库表。因此,在上面的示例之后,您的数据库表将看起来像这样

顶部

HTTP

使用 HTTP 写入器需要 pop-http 组件。它创建一个请求并将其发送到 HTTP 日志资源。(有关如何使用 HTTP 客户端的更多信息,请参阅 pop-http 文档。)

use Pop\Log\Logger;
use Pop\Log\Writer;
use Pop\Http\Client;
use Pop\Http\Auth;

$client = new Client(
    'https://logs.mydomain.com/',
    ['method' => 'POST'],
    Auth::createKey('LOG_API_KEY')
);

$log = new Logger(new Writer\Http($client);
$log->info('Just a info message');
$log->alert('Look Out! Something serious happened!');

日志写入器将使用以下 HTTP 数据字段将带有日志数据的 HTTP 请求发送到 HTTP 服务

  • 时间戳
  • 级别
  • 名称
  • 消息
  • 上下文

顶部

上下文

为了提供额外的上下文信息,可以传递 $context 数组到触发日志条目的方法中。它可以包含

$context = [
    'name'      => 'my-log-entry',
    'timestamp' => date('Y-m-d H:i:s'),
    'format'    => 'json'
];
use Pop\Log\Logger;
use Pop\Log\Writer\File;

$log = new Logger(new File(__DIR__ . '/logs/app.log'));

$context = [
    'name'      => 'my-log-entry',
    'timestamp' => date('Y-m-d H:i:s')
];

$log->info('Just a info message', $context);

顶部

限制

可以为日志写入器对象设置日志级别限制,以强制实际记录的日志消息的严重性

use Pop\Log\Logger;
use Pop\Log\Writer\File;

$prodLog = new File(__DIR__ . '/logs/app_prod.log');
$devLog  = new File(__DIR__ . '/logs/app_dev.log');

$prodLog->setLogLimit(3); // Log only ERROR (3) and above
$devLog->setLogLimit(6);  // Log only INFO (6) and above

$log = new Logger([$prodLog, $devLog]);

$log->alert('Look Out! Something serious happened!'); // Will write to both writers
$log->info('Just a info message');                    // Will write to only app_dev.log

app_prod.log 文件将包含

2023-11-11 12:32:33    1    ALERT   Look Out! Something serious happened!

app_dev.log 文件将包含

2023-11-11 12:32:33    1    ALERT   Look Out! Something serious happened!
2023-11-11 12:32:34    6    INFO    Just a info message