OriginPHP 日志

2.0.1 2021-11-19 13:05 UTC

This package is auto-updated.

Last update: 2024-09-19 19:17:43 UTC


README

license build coverage

该日志包含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: 超时秒数

您应该首先测试您的电子邮件配置,如果在尝试发送电子邮件时发生异常,则会被捕获并不会记录以防止递归。

控制台引擎

console

要配置控制台引擎

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 命令传递设置,这些是 identityoptionfacility,有关这些设置的作用,请参阅 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']
]);