popphp / pop-log
Pop PHP 框架的日志组件
Requires
- php: >=8.1.0
Requires (Dev)
- phpunit/phpunit: ^10.0.0
- popphp/pop-db: ^6.5.0
- popphp/pop-http: ^5.0.2
- popphp/pop-mail: ^4.0.0
README
概览
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-log
是 Pop 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!');
在这种情况下,日志被写入一个具有 id
、timestamp
、level
、name
和 message
列的数据库表。因此,在上面的示例之后,您的数据库表将看起来像这样
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