我在这个小小的 github repo 中重新创建了一个简单的例子。我正在尝试使用symfony/dependency-injection
配置monolog/monolog
将日志写入php://stderr
. 我正在使用一个名为 services.yml 的 yaml 文件来配置依赖注入。
如果我的 yml 文件如下所示,这一切都可以正常工作:
parameters:
log.file: 'php://stderr'
log.level: 'DEBUG'
services:
stream_handler:
class: \Monolog\Handler\StreamHandler
arguments:
- '%log.file%'
- '%log.level%'
log:
class: \Monolog\Logger
arguments: [ 'default', ['@stream_handler'] ]
$APP_LOG
但是,我的目标是分别从环境变量中读取日志文件的路径和日志级别LOG_LEVEL
。根据外部参数的交响乐文档,在 services.yml 文件中执行此操作的正确方法如下:
parameters:
log.file: '%env(APP_LOG)%'
log.level: '%env(LOGGING_LEVEL)%'
在我的示例应用程序中,我验证 PHP 可以使用以下内容读取这些环境变量:
echo "Hello World!\n\n";
echo 'APP_LOG=' . (getenv('APP_LOG') ?? '__NULL__') . "\n";
echo 'LOG_LEVEL=' . (getenv('LOG_LEVEL') ?? '__NULL__') . "\n";
当我使用带有硬编码值的原始 services.yml 时,它会将以下内容写入浏览器:
Hello World!
APP_LOG=php://stderr
LOG_LEVEL=debug
但是,如果我在 services.yml 中使用 %env(VAR_NAME)% 语法,则会收到以下错误:
致命错误:未捕获的 UnexpectedValueException:无法打开流或文件“env_PATH_a61e1e48db268605210ee2286597d6fb”:无法打开流:/var/www/vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php:107 中的权限被拒绝: #0 /var/www/vendor/monolog/monolog/src/Monolog/Handler/AbstractProcessingHandler.php(37): Monolog\Handler\StreamHandler->write(Array) #1 /var/www/vendor/monolog/monolog /src/Monolog/Logger.php(337): Monolog\Handler\AbstractProcessingHandler->handle(Array) #2 /var/www/vendor/monolog/monolog/src/Monolog/Logger.php(532): Monolog\Logger ->addRecord(100, 'Initialized dep...', Array) #3 /var/www/html/index.php(17): Monolog\Logger->debug('Initialized dep...') #4 { main} 在第 107 行抛出 /var/www/vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php
我究竟做错了什么?