originphp / log
OriginPHP 日志
Requires
- php: >=7.3.0
- originphp/configurable: ^2.0.0
- originphp/email: ^2.0
- psr/log: ^1.0.1 || ^2.0
Requires (Dev)
- phpstan/phpstan: ^0.12.64
- phpunit/phpunit: ^9.2
README
该日志包含4个内置日志引擎,并且很容易实现自己的引擎。您可以使用 Log
静态类或 PSR-3 Logger
类。
安装
要安装此包
$ composer require originphp/log
文件
- 将日志消息记录到文件控制台
- 在控制台屏幕上显示日志消息邮件
- 通过电子邮件发送日志消息Syslog
- 适用于生产系统
首先,您需要在应用程序引导或配置中配置日志库。
Log::config('default', [ 'engine' => 'File', 'file' => '/var/www/logs/application.log' ]);
然后进行日志记录
use Origin\Log\Log; Log::error('Something has gone wrong.');
这将生成类似以下的内容到 /var/www/logs/application.log
。
[2019-03-10 13:37:49] application ERROR: Something has gone wrong.
通道
要分组您的日志消息,设置一个通道名称。
use Origin\Log\Log; Log::error('Something has gone wrong.',['channel'=>'invoices']);
这将创建一个类似以下的日志条目
[2019-03-10 13:37:49] invoices ERROR: Something has gone wrong.
占位符
您还可以在消息中使用占位符。
Log::info('Email sent to {email}',['email'=>'donny@example.com']);
向消息添加数据
在替换所有占位符之后,任何剩余的数据将被转换为 JSON 字符串。
Log::info('User registered',['username'=>'pinkpotato']);
这将输出如下
[2019-03-10 13:37:49] application INFO: User registered {"username":"pinkpotato"}
日志级别
日志与 RFC 5424 规范中定义的所有不同级别一起工作。
Log::emergency('system is unusable'); Log::alert('action must be taken immediately'); Log::critical('a critical condition'); Log::error('an error has occured'); Log::warning('warning low disk space'); Log::notice('normal, but significant, condition'); Log::info('informational message'); Log::debug('debug-level message');
配置
您可以使用单个引擎或同时使用多个引擎,并且您还可以自定义要记录的级别。
文件引擎
要配置文件引擎日志记录
use Origin\Log\Log; Log::config('file',[ 'engine' => 'File', 'file' => '/var/www/logs/application.log', 'size' => 10485760, // or 10MB, 'rotate' => 3 ]);
文件引擎的选项有
- file: 完整路径的文件
- levels: 默认
[]
。如果您想将此配置限制为仅某些级别,请将级别添加到数组中,例如['critical','emergency','alert']
- channels: 默认
[]
。如果您想将此配置限制为仅某些通道,请将通道添加到数组中,例如['invoices','payments']
- size: 旋转日志的字节数,您也可以使用 MB 或 GB,例如 10MB。要禁用日志旋转,请将其设置为
0
。 - rotate: 旋转次数,如果设置为 0,则达到该大小后将其删除。
邮件引擎
要配置邮件日志记录
use Origin\Log\Log; Log::config('default',[ 'engine' => 'Email', 'to' => 'you@example.com', // string email only 'from' => ['no-reply@example.com' => 'Web Application'] // to add a name, use an array, 'host' => 'smtp.example.com', 'port' => 465, 'username' => 'demo@example.com', 'password' => 'secret', 'timeout' => 5, 'ssl' => true, 'tls' => false ]);
邮件引擎的选项有
- levels: 默认
[]
。如果您想将此配置限制为仅某些级别,请将级别添加到数组中,例如['critical','emergency','alert']
- channels: 默认
[]
。如果您想将此配置限制为仅某些通道,请将通道添加到数组中,例如['invoices','payments']
- to: 要发送到的电子邮件地址或包含电子邮件地址和名称的数组。例如
you@example.com
或['you@example.com','Tony Robbins']
。 - from: 要发送的电子邮件地址或包含电子邮件地址和名称的数组。例如
no-reply@example.com
或['no-reply@example.com'=>'系统通知']
。 - host: 这是 SMTP 服务器的主机名
- port: 端口号默认为 25
- username: 访问此 SMTP 服务器时使用的用户名
- password: 访问此 SMTP 服务器时使用的密码
- ssl: 默认为 false,如果要通过 SSL 连接,请设置为 true
- tls: 默认为 false,如果要启用 TLS,请设置为 true
- timeout: 超时秒数
您应该首先测试您的电子邮件配置,如果在尝试发送电子邮件时发生异常,则会被捕获并不会记录以防止递归。
控制台引擎
要配置控制台引擎
use Origin\Log\Log; Log::config('default',[ 'engine' => 'Console' ]);
控制台引擎的选项有
- 流:默认:
php://stderr
这是需要使用的流 - levels: 默认
[]
。如果您想将此配置限制为仅某些级别,请将级别添加到数组中,例如['critical','emergency','alert']
- channels: 默认
[]
。如果您想将此配置限制为仅某些通道,请将通道添加到数组中,例如['invoices','payments']
系统日志引擎
您应该在生产服务器上使用系统日志引擎。要配置系统日志引擎。
use Origin\Log\Log; Log::config('default',[ 'engine' => 'Syslog' ]);
系统日志引擎的选项有
- levels: 默认
[]
。如果您想将此配置限制为仅某些级别,请将级别添加到数组中,例如['critical','emergency','alert']
- channels: 默认
[]
。如果您想将此配置限制为仅某些通道,请将通道添加到数组中,例如['invoices','payments']
您也可以向 openlog
命令传递设置,这些是 identity
、option
、facility
,有关这些设置的作用,请参阅 openlog 以获取更多信息。
示例
假设您想配置记录器将所有事件正常记录到文件中,通过电子邮件发送临界日志条目,并为仅支付创建单独的日志。
use Origin\Log\Log; // Logs all items to file Log::config('default',[ 'engine' => 'File', 'file' => '/var/www/logs/master.log' ]); // Send import log items by email Log::config('critical-emails',[ 'engine' => 'Email', 'to' => 'you@example.com', 'from' => ['nobody@gmail.com' => 'Web Application'], 'levels' => ['critical','emergency','alert'], 'host' => 'smtp.gmail.com', 'port' => 465, 'username' => 'nobody@gmail.com', 'password' => 'secret', 'ssl' => true, ]); // Create a seperate log for everything from the payments channel Log::config('payments',[ 'engine' => 'File', 'file' => '/var/www/logs/payments.log', 'channels' => ['payments'] ]);
创建自定义日志引擎
要创建自定义日志引擎,创建文件夹结构 app/Log/Engine
,并创建一个具有 log
方法的引擎类。
namespace App\Log\Engine; use Origin\Log\Engine\BaseEngine; class DatabaseEngine extends BaseEngine { /** * Setup your default config here * * @var array */ protected $defaultConfig = []; /** * This will be called when the class is constructed * * @var array */ protected function initialize(array $config) : void { } /** * Logs an item * * @param string $level e.g debug, info, notice, warning, error, critical, alert, emergency. * @param string $message 'this is a {what}' * @param array $context ['what'='string'] * @return void */ public function log(string $level, string $message, array $context = []) : void { $message = $this->format($level, $message, $context); // do something } }
然后在您的引导配置中
use Origin\Log\Log; Log::config('default',[ 'className' => 'App\Log\Engine\DabaseEngine' ]);
PSR-3 记录器
日志库使用 PSR-3 记录器,您可能希望使用它而不是静态的 Log
类。
当您创建 Logger
实例时,您可以传递单个引擎配置,这在刚开始一个新的应用程序时很常见。
use Origin\Log\Logger; $logger = new Logger([ 'engine' => 'File', 'file' => '/var/www/logs/master.log' ]);
要更改引擎的设置,或添加额外的引擎或引擎配置
$logger->config('default',[ 'engine' => 'File', 'file' => '/var/www/logs/application.log' ]); // Send import log items by email $logger->config('critical-emails',[ 'engine' => 'Email', 'to' => 'you@example.com', 'from' => ['nobody@gmail.com' => 'Web Application'], 'levels' => ['critical','emergency','alert'], 'host' => 'smtp.gmail.com', 'port' => 465, 'username' => 'nobody@gmail.com', 'password' => 'secret', 'ssl' => true ]); // Create a seperate log for everything from the payments channel $logger->config('payments',[ 'engine' => 'File', 'file' => '/var/www/logs/payments.log', 'channels' => ['payments'] ]);