tobento/app-logging

应用日志支持。

1.0.2 2024-02-21 16:02 UTC

This package is auto-updated.

Last update: 2024-09-21 17:14:16 UTC


README

使用Monolog库为应用提供日志支持。

目录

入门

运行此命令以添加应用日志项目的最新版本。

composer require tobento/app-logging

需求

  • PHP 8.0或更高版本

文档

应用

如果您正在使用骨架,请查看 App Skeleton

您还可以查看 App 以了解更多关于应用的一般信息。

日志启动

日志启动执行以下操作

  • 安装和加载日志配置文件
  • 实现日志接口
use Tobento\App\AppFactory;
use Tobento\App\Logging\LoggersInterface;
use Psr\Log\LoggerInterface;

// Create the app
$app = (new AppFactory())->createApp();

// Add directories:
$app->dirs()
    ->dir(realpath(__DIR__.'/../'), 'root')
    ->dir(realpath(__DIR__.'/../app/'), 'app')
    ->dir($app->dir('app').'config', 'config', group: 'config')
    ->dir($app->dir('root').'public', 'public')
    ->dir($app->dir('root').'vendor', 'vendor');

// Adding boots
$app->boot(\Tobento\App\Logging\Boot\Logging::class);
$app->booting();

// Implemented interfaces:
$logger = $app->get(LoggerInterface::class);
$loggers = $app->get(LoggersInterface::class);

// Run the app
$app->run();

日志配置

日志配置位于默认App骨架配置位置的 app/config/logging.php 文件中,您可以在此处指定应用的日志记录器。

使用 懒日志记录器 用于日志记录器。

Logger特质

您可以使用Logger特质快速访问日志记录器实例并记录消息

use Tobento\App\Logging\LoggerTrait;

class SomeService
{
    use LoggerTrait;

    public function someAction(): void
    {
        $this->getLogger()->info('Some info');
        // is same as:
        $this->getLogger(name: static::class)->info('Some info');
        // if the named logger does not exists,
        // the default logger will be used.
        
        // or using another named logger:
        $this->getLogger(name: 'daily')->info('Some info');
    }
}

接下来,您可以定义用于服务的日志记录器。

日志配置 文件中,定义您的服务类和要使用的日志记录器

/*
|--------------------------------------------------------------------------
| Aliases
|--------------------------------------------------------------------------
*/

'aliases' => [
    SomeService::class => 'daily',
],

或者,您可以从您的应用请求 LoggersInterface::class 或将其注入任何类并使用 addAlias 方法

use Tobento\App\Logging\LoggersInterface;

$app->get(LoggersInterface::class)->addAlias(alias: SomeService::class, logger: 'daily');

日志记录器

懒日志记录器

LazyLoggers::class 仅在需要时创建日志记录器。

use Tobento\App\Logging\LazyLoggers;
use Tobento\App\Logging\LoggerFactoryInterface;
use Tobento\App\Logging\LoggersInterface;
use Tobento\App\Logging\StackLoggerFactory;
use Psr\Container\ContainerInterface;
use Psr\Log\LoggerInterface;
use Psr\Log\NullLogger;

$loggers = new LazyLoggers(
    container: $container, // ContainerInterface
    loggers: [
        // using a closure:
        'daily' => static function (string $name, ContainerInterface $c): LoggerInterface {
            // create logger ...
            return $logger;
        },
        
        // using a factory:
        'stacked' => [
            // factory must implement LoggerFactoryInterface
            'factory' => StackLoggerFactory::class,
            'config' => [
                'loggers' => ['daily', 'another'],
            ],
        ],
        
        // or you may sometimes just create a logger (not lazy):
        'null' => new NullLogger(),
    ],
);

var_dump($loggers instanceof LoggersInterface);
// bool(true)

请参阅 Logger工厂 部分了解可用的Logger工厂。

请参阅 Logger接口 部分了解相关信息。

Logger工厂

堆栈Logger工厂

StackLoggerFactory::class 创建具有指定日志记录器的堆栈日志记录器。

use Tobento\App\Logging\StackLoggerFactory;
use Tobento\App\Logging\LoggerFactoryInterface;
use Tobento\App\Logging\LoggersInterface;

$factory = new StackLoggerFactory(
    loggers: $loggers // LoggersInterface
);

var_dump($factory instanceof LoggerFactoryInterface);
// bool(true)

请参阅 日志记录器 部分了解可用的日志记录器。

创建日志记录器

use Psr\Log\LoggerInterface;
use Tobento\App\Logging\StackLogger;

$logger = $factory->createLogger(name: 'stacked', config: [
    // specify the loggers you want to be stacked:
    'loggers' => ['daily', 'syslog'],
]);

var_dump($logger instanceof LoggerInterface);
// bool(true)

var_dump($logger instanceof StackLogger);
// bool(true)

事件

可用事件

use Tobento\App\Logging\Event;

事件支持

您可以在 日志配置 文件中添加 EventHandler::class 并安装 App Event 包以支持事件。

use Tobento\App\Logging\Monolog\EventHandler;
use Psr\Container\ContainerInterface;
use Psr\Log\LoggerInterface;

'loggers' => [

    'daily' => static function (string $name, ContainerInterface $c): LoggerInterface {
        return new Logger(
            name: $name,
            handlers: [
                // support events:
                $c->get(EventHandler::class),
            ],
        );
    },
],

接口

日志记录器接口

请参阅实现 Tobento\App\Logging\LoggersInterface::class 的可用 日志记录器

添加

使用 add 方法您可以添加新的日志记录器

use Psr\Log\LoggerInterface;

$loggers->add(name: 'daily', logger: $logger); // LoggerInterface

// or using a closure:
$loggers->add(name: 'daily', logger: static function (): LoggerInterface {
    return $createdLogger;
});

添加别名

使用 addAlias 方法您可以为指定的日志记录器添加别名

$loggers->addAlias(alias: 'alias', logger: 'daily');

// get a logger by an alias:
$logger = $loggers->get('alias');
// returns the 'daily' logger if exists.

日志记录器

logger 方法返回一个日志记录器

use Psr\Log\LoggerInterface;

// get the default logger:
$logger = $loggers->logger();

// get a named logger:
$logger = $loggers->logger(name: 'daily');

// get an aliased logger:
$logger = $loggers->logger(name: 'alias');

var_dump($logger instanceof LoggerInterface);
// bool(true)

获取

get 方法如果存在则返回一个日志记录器,否则返回 null

use Psr\Log\LoggerInterface;

// get a named logger:
$logger = $loggers->get(name: 'daily');

// get an aliased logger:
$logger = $loggers->get(name: 'alias');

var_dump($logger instanceof LoggerInterface);
// bool(true) or NULL if not exist

检查

has 方法如果存在则返回 true,否则返回 false

$has = $loggers->has(name: 'daily');

// with an alias:
$has = $loggers->has(name: 'alias');

名称

names 方法返回所有日志记录器名称

$names = $loggers->names();

var_dump($names);
// array(1) {[0]=> string(5) "daily"}

创建

created 方法返回所有创建的日志记录器,可用于重置或清除日志记录器

use Psr\Log\LoggerInterface;

$loggers = $loggers->created();
// array<string, LoggerInterface>

Logger工厂接口

查看实现 Tobento\App\Logging\LoggerFactoryInterface::class 的可用 日志工厂

createLogger

createLogger 方法根据配置创建一个新的日志记录实例。

use Psr\Log\LoggerInterface;

$logger = $loggerFactory->createLogger(
    name: 'stacked', // a logger name
    config: [], // any data for creating the logger
);

var_dump($logger instanceof LoggerInterface);
// bool(true)

鸣谢