0

我正在使用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'常量被独白类用作'ERROR',而不是'LOG_LEVEL'。我在这里做错了什么,现在已经搜索了几个小时没有任何运气的答案。

4

4 回答 4

1

您现在正在执行$logger::LOG_LEVEL'LOG_LEVEL' 从类中取出$logger(在本例中为 a \Monolog\Logger)。那没有名为 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); 

这样做的好处是只有一个配置文件,而不是分散在各种文件中,这很快就会变得非常烦人。

于 2019-05-17T16:00:49.503 回答
0

你让这变得比它需要的更复杂。Monolog具有将错误级别作为字符串转换为自己的内部值的功能。只需将您的代码更改为:

$fileHandler = new \Monolog\Handler\StreamHandler(LOG_FILE, $logger::toMonologLevel(LOG_LEVEL));
于 2019-05-17T16:10:22.087 回答
0

你也可以Logger::getLevels()像下面这样使用:

$log_level = $logger->getLevels()[LOG_LEVEL];
$fileHandler = new ...StreamHandler(LOG_FILE, $log_level);
于 2019-05-17T15:57:13.483 回答
0

制作一个静态类并包含它...

class GLOBALCONF{
    public static $VALUE= 'Something in here';
}

// Use it where you want
GLOBALCONF::$VALUE
于 2019-05-17T16:02:39.533 回答