Боюсь, что весь ваш дизайн просто неверен.
Вместо того, чтобы создавать новый Logger
каждый раз, когда вам нужно войти, вы должны создать один $logger
для использования в качестве службы вокругваше приложение.
Не зная больше о вашем приложении (и необходимость переписать ваше приложение сделает вопрос слишком широким в любом случае), трудно догадаться, как реализовать внедрение зависимостей здесь.
Но упрощенный и наивный подход будет следующим:
class users extends dbconnector {
protected $logger;
public function _construct(Logger $logger) {
$this->logger = $logger;
}
function login() {
$this->logger->info('User logged successfully');
}
}
А затем:
$logger = new Logger('applog');
$handler = new RotatingFileHandler('useractivity.log', 0, Logger::INFO);
$handler->setFormatter(new LineFormatter("[%datetime%] %extra.process_id% %channel%.%level_name%: %message% %extra% %context% \n"));
$logger->pushHandler($handler);
$logger->pushProcessor(new WebProcessor);
$logger->pushProcessor(new IntrospectionProcessor);
$users = new users($logger);
Если вы добавите этот экземпляр Logger
вОбъекты, которые нуждаются в этом, вы можете использовать его напрямую, не создавая собственную «обертку» (которая в вашем примере была плохо спроектирована), и выходные данные в файлах журналов будут соответствовать вашим ожиданиям.
Обратите внимание, что выне используете IntrospectionProcessor
, который вам понадобится для захвата имени файла и номера строки файла.В приведенном выше примере я также помещаю его в $logger
, экземпляр Logger
.
(И также обратите внимание, что простое добавление этого процессора в ваш код не решит вашу проблему, так как вызовLogger::info()
всегда происходит в app_log::info()
).
Помните, что вам нужно добавить соответствующий оператор use
: use Monolog\Processor\IntrospectionProcessor;
Я не знаю всех деталейвашей системы, и в любом случае не может собрать все это для вас, но если внедрение зависимостей все еще слишком для вас, вы можете просто временно обмануть с помощью подхода глобального состояния.
Например:
function get_logger() {
static $logger;
if ($logger !== null) {
return $logger;
}
$logger = new Logger('applog');
$handler = new RotatingFileHandler('useractivity.log', 0, Logger::INFO);
$handler->setFormatter(new LineFormatter("[%datetime%] %extra.process_id% %channel%.%level_name%: %message% %extra% %context% \n"));
$logger->pushHandler($handler);
$logger->pushProcessor(new WebProcessor);
$logger->pushProcessor(new IntrospectionProcessor);
return $logger;
}
Вы можете поместить это в файл, который вы require_once
, и в каждом из этих мест, где вам нужен доступ к регистратору, вы можете просто сделать:
get_logger()->info('write to the log!');
Это нечто-то, что я бы одобрил , но это крутой обходной путь для вас, чтобы двигаться, пока вы не продвинетесь в понимании других тем ООП.Это не что иное, как человек бедного синглтон , которого чаще всего следует избегать;но это может помочь вам прямо сейчас ..