如何通过Symfony依赖注入模块在类库中实现日志功能?
解决Symfony Monolog集成问题并实现类库日志功能
我来帮你搞定这个问题——你碰到的package not found报错,根源是composer require logger是Symfony Flex专属的快捷别名,只在完整的Symfony框架项目中生效。你的项目是独立类库,不需要Symfony Bundle,所以得换个方式装依赖,再通过DI和配置来实现日志功能:
一、先修复安装错误
直接安装核心依赖包,代替Flex的别名命令:
composer require monolog/monolog symfony/dependency-injection symfony/config
monolog/monolog:Monolog的核心日志库,负责实际的日志记录symfony/dependency-injection:Symfony的依赖注入组件,用来管理服务依赖symfony/config:Symfony的配置加载组件,帮你解析和加载日志配置
二、配置日志服务
在类库根目录创建config文件夹,新增monolog.yaml配置文件,定义日志实例和处理器:
services: _defaults: autowire: true autoconfigure: true public: false # 绑定PSR-3日志接口到Monolog实现 Psr\Log\LoggerInterface: class: Monolog\Logger arguments: ['your_library_identifier'] # 给你的日志打个标识,方便区分 calls: - method: pushHandler arguments: ['@Monolog\Handler\StreamHandler'] # 定义文件日志处理器,输出到指定文件 Monolog\Handler\StreamHandler: arguments: - '%kernel.logs_dir%/library.log' # 日志文件路径,可自行修改 - !php/const Monolog\Logger::INFO # 日志级别,INFO及以上都会被记录
三、初始化依赖注入容器
写个简单的容器工厂类(比如src/ContainerFactory.php),用来加载配置并构建DI容器:
<?php namespace YourLibraryNamespace; use Symfony\Component\Config\FileLocator; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Loader\YamlFileLoader; class ContainerFactory { public static function create(): ContainerBuilder { $container = new ContainerBuilder(); // 设置日志目录参数,确保目录存在 $logDir = __DIR__ . '/../var/logs'; $container->setParameter('kernel.logs_dir', $logDir); if (!is_dir($logDir)) { mkdir($logDir, 0755, true); } // 加载刚才写的日志配置 $loader = new YamlFileLoader($container, new FileLocator(__DIR__ . '/../config')); $loader->load('monolog.yaml'); $container->compile(); return $container; } }
四、在类库方法中注入并使用日志
在你的业务类里,通过构造函数注入Psr\Log\LoggerInterface,就能在方法里记录运行状态了:
<?php namespace YourLibraryNamespace\Services; use Psr\Log\LoggerInterface; class YourCoreService { private LoggerInterface $logger; public function __construct(LoggerInterface $logger) { $this->logger = $logger; } public function executeBusinessLogic(array $input): array { // 记录方法开始执行的信息 $this->logger->info('业务逻辑开始执行', ['input' => $input]); try { // 这里写你的核心业务代码 $result = ['status' => 'success', 'data' => 'processed']; // 记录步骤完成的调试信息 $this->logger->debug('数据处理完成', ['result' => $result]); return $result; } catch (\Throwable $e) { // 记录错误信息,包含异常详情 $this->logger->error('业务逻辑执行失败', [ 'error_message' => $e->getMessage(), 'error_trace' => $e->getTraceAsString() ]); throw $e; // 可以选择抛出异常或者处理,根据你的类库需求 } } }
五、使用示例
在类库的测试代码或入口脚本中,初始化容器并调用服务:
<?php require __DIR__ . '/vendor/autoload.php'; use YourLibraryNamespace\ContainerFactory; use YourLibraryNamespace\Services\YourCoreService; $container = ContainerFactory::create(); $service = $container->get(YourCoreService::class); // 调用方法,日志会自动记录到指定文件 $service->executeBusinessLogic(['key' => 'value']);
这样你的类库就能通过依赖注入和配置驱动的方式,完美记录方法内的运行情况了。
内容的提问来源于stack exchange,提问作者JorgeeFG
相关产品推荐
相关产品推荐

