Я пытаюсь найти лучший способ добавить логирование в мои статические методы в служебных классах. Я использую log4php для входа. Что я хотел бы сделать, это:
<?php
require_once WEBSITE_BASE_DIR . "/log4php/Logger.php";
class TestUtil
{
private static $log = Logger::getLogger( "testutil" );
public static function utilMethod1()
{
self::$log->trace("Entering utilMethod1");
// ... do stuff ...
self::$log->trace("Exiting utilMethod1");
}
public static function utilMethod2()
{
self::$log->trace("Entering utilMethod2");
// ... do stuff ...
self::$log->trace("Exiting utilMethod2");
}
}
Тем не менее, я не могу сделать это в PHP и получить синтаксическую ошибку при инициализации $log
статическая переменная Единственный способ, которым я могу понять, как это сделать, это добавить init()
вызов каждого статического метода:
<?php
require_once WEBSITE_BASE_DIR . "/log4php/Logger.php";
class TestUtil
{
private static $log = NULL;
private static function init()
{
if (self::$log == NULL)
{
self::$log = Logger::getLogger( "testutil" );
}
}
public static function utilMethod1()
{
self::init();
self::$log->trace("Entering utilMethod1");
// ... do stuff ...
self::$log->trace("Exiting utilMethod1");
}
public static function utilMethod2()
{
self::init();
self::$log->trace("Entering utilMethod2");
// ... do stuff ...
self::$log->trace("Exiting utilMethod2");
}
}
Но это кажется чрезмерным количеством избыточного кода, так как у меня есть много служебных классов со многими статическими методами. Есть лучший способ сделать это?
Вы могли бы иметь статический метод, который определяет регистратор. Вы можете позвонить один раз, когда вы запускаете приложение.
public static function setLogger(LogInterface $logger)
{
self::$log = $logger;
}
Второе, что вы можете сделать, это иметь статический метод, который возвращает экземпляр регистратора вместо использования статического свойства.
private static function log()
{
return Logger::getLogger( "testutil" );
}
Тогда вместо звонка self::$log->trace()
, ты бы просто позвонил self::log()->trace()
,
Других решений пока нет …