如何实例化记录器并能够从所有被调用的类中使用它?

时间:2017-04-21 15:24:53

标签: php monolog

我将尝试通过一个例子解释我的问题:

我们有1个主要的PHP脚本,它实例化了一些类/对象,我们的项目特定代码。我们想要为所有这些类添加一个记录器。这样做的常用方法是什么?为了一个例子,我们想要Monolog,它应该被实例化:

$log = new Monolog\Logger('name');
$log->pushHandler(new Monolog\Handler\StreamHandler('app.log', Monolog\Logger::WARNING));
$log->addWarning('Foo');

选项#1:我们每班可以有1个独白。我猜不是最好的选择。

选项#2:从主脚本中,有一个$ log对象,并将其传递给每个被调用对象(然后在每个对象__construct中将$ log分配给私有变量$ class_logger然后使用它:

例如,主脚本:

$logger = Logger::getLogger("main");
$logger->info("This is an informational message.");
$logger->warn("I'm not feeling so good...");

$test_run = new called_object($logger);
$test_run->call_it();

called_object类:

class called_object {


    private $logger;

    public function __construct($log)
    {
        $this->logger = $log;
    }

    public function call_it()
    {
        $this->logger->warn("from called_object!");
    }
}
第二个似乎更好,但我觉得它不太实际,也许我在这里错过了一些东西?

1 个答案:

答案 0 :(得分:1)

第二个选项名为{{3}},是首选。它为您提供单点配置 - 例如,如果您想要更改记录器的行为方式,您只需要在一个位置执行此操作。它还允许更容易的测试,例如,您可能有一个单独的测试配置,用于配置空记录器。