tobento / app-logging
应用日志支持。
Requires
- php: >=8.0
- monolog/monolog: ^2.9
- psr/container: ^2.0
- psr/event-dispatcher: ^1.0
- psr/log: ^1.1 || ^2.0 || ^3.0
- tobento/app: ^1.0.7
- tobento/app-migration: ^1.0
- tobento/service-autowire: ^1.0.9
- tobento/service-helper-function: ^1.0.4
Requires (Dev)
- phpunit/phpunit: ^9.5
- tobento/app-event: ^1.0
- tobento/service-container: ^1.0.6
- tobento/service-event: ^1.0
- tobento/service-filesystem: ^1.0.5
- vimeo/psalm: ^4.0
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)