恐怕你的整个设计都是错误的。
而不是实例化一个新的Logger
每次需要登录时,您都应该创建一个$logger
用作您的应用程序周围的服务。
在不了解有关您的申请的更多信息的情况下(并且必须重写您的申请将使问题太宽泛无论如何),很难猜测如何实现依赖注入 here.
但一个简单而幼稚的方法是:
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 https://github.com/Seldaek/monolog/blob/master/doc/02-handlers-formatters-processors.md#processors,您需要捕获文件名和文件行号。在上面的例子中我也将它推入$logger
, the Logger
实例。
(还要注意,简单地将此处理器添加到您的代码中并不能解决您的问题,因为调用Logger::info()
总是会发生在app_log::info()
).
请记住,您需要添加相应的use
陈述:use Monolog\Processor\IntrospectionProcessor;
我不知道你的系统的所有细节,也无法为你构建所有的细节,但如果依赖注入对你来说仍然太多,你可以暂时用全局状态方法作弊。
E.g.:
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!');
这不是我赞同的事情,但是在您对其他 OOP 主题的理解有所进步之前,这是一个糟糕的解决方法。这无非就是一个穷人单例 https://en.wikipedia.org/wiki/Singleton_pattern,这通常是一种应该避免的模式;但这现在可以帮助你..