我正在使用Monolog创建应用程序的日志记录系统。在核心应用程序文件中,创建新的Monolog对象后,需要选择要在日志文件中打印的日志级别。我想使用全局常量LOG_LEVEL
,它可以是'DEBUG','INFO'等。我需要Monolog类将其值视为类常量。
// content of config.php
// Here I declare the constants in a separate file called 'config.php'
define("LOG_FILE", "patch/to/my/log.log");
define("LOG_LEVEL", "ERROR");
// content of app.php
require 'config.php';
require 'vendor/autoload.php';
$container['logger'] = function($c) {
$logger = new \Monolog\Logger('logger');
error_log('log level ' . LOG_LEVEL); // prints 'log level ERROR'
$fileHandler = new \Monolog\Handler\StreamHandler(LOG_FILE, $logger::LOG_LEVEL); // here I get the error 'Undefined class constant LOG_LEVEL'
//the normal syntax would be '$logger::ERROR' in this case and that works fine
$logger->pushHandler($fileHandler);
return $logger;
};
我需要'LOG_LEVEL'常量由monolog类用作'ERROR',而不是'LOG_LEVEL'。我在这里做错什么了,已经找了好几个小时没有任何运气了。
答案 0 :(得分:1)
您现在正在做$logger::LOG_LEVEL
,这将从类$logger
(在本例中为\Monolog\Logger
)中删除“ LOG_LEVEL”。它没有名为LOG_LEVEL的静态变量,因此您获得了未定义的信息。
在任何类中,您都只定义了'LOG_LEVEL',所以:
$fileHandler = new \Monolog\Handler\StreamHandler(LOG_FILE, LOG_LEVEL);
理想的解决方案:
您可以做一个静态类,并将其包含在您的主页中:
Class CONFIG {
public static $LOG_LEVEL = 'default Value';
}
// Then you can use this anywhere:
CONFIG::$LOG_LEVEL
$fileHandler = new \Monolog\Handler\StreamHandler(LOG_FILE, CONFIG::$LOG_LEVEL);
这样做的好处是配置文件只有一个,不会分散在所有文件中,这会非常烦人。
答案 1 :(得分:0)
您还可以如下使用Logger::getLevels()
:
$log_level = $logger->getLevels()[LOG_LEVEL];
$fileHandler = new ...StreamHandler(LOG_FILE, $log_level);
答案 2 :(得分:0)
制作一个静态类并包含该类...
class GLOBALCONF{
public static $VALUE= 'Something in here';
}
// Use it where you want
GLOBALCONF::$VALUE
答案 3 :(得分:0)
您正在使它变得比所需的复杂。 Monolog has a function,可将错误级别作为字符串转换为自己的内部值。只需将代码更改为此:
$fileHandler = new \Monolog\Handler\StreamHandler(LOG_FILE, $logger::toMonologLevel(LOG_LEVEL));