使用openlog-php实现多线程
我在我的项目中使用日志记录,首先,我初始化一些对象,我使用带有特定标识的openlog函数,然后使用syslog来编写我需要的所有内容。但我有一个问题,在对象中有一些外部请求,我想为它们更改ident,所以我尝试执行如下操作:使用openlog-php实现多线程,php,unix,Php,Unix,我在我的项目中使用日志记录,首先,我初始化一些对象,我使用带有特定标识的openlog函数,然后使用syslog来编写我需要的所有内容。但我有一个问题,在对象中有一些外部请求,我想为它们更改ident,所以我尝试执行如下操作: openlog($ident, LOG_PID, LOG_USER); syslog(LOG_DEBUG, $data); .... // external request in other place, where $ident is not available ope
openlog($ident, LOG_PID, LOG_USER);
syslog(LOG_DEBUG, $data);
....
// external request in other place, where $ident is not available
openlog($newIdent, LOG_PID, LOG_USER);
syslog(LOG_DEBUG, $data);
closelog();
// here I wanna change openlog to initial value
openlog(?, LOG_PID, LOG_USER);
那么,我如何获得第一个openlog标识,或者这是做同样事情的另一种方法?以下是一些我认为有效的代码。我正在使用单例类
记录器:
<?
class Logger {
private $idents = [];
public static function Instance()
{
static $inst = null;
if ($inst === null) {
$inst = new Logger();
}
return $inst;
}
private function __construct()
{
}
function openlog($ident, $option = LOG_PID, $facility = LOG_USER) {
array_unshift($this->idents, $ident);
return openlog($ident, $option, $facility);
}
function closelog() {
closelog();
array_shift($this->idents);
if ($this->idents) {
return openlog($this->idents[0]);
}
}
}
$logger = Logger::Instance();
$ident = 'id1';
$logger->openlog($ident, LOG_PID, LOG_USER);
$data = 'test1';
syslog(LOG_DEBUG, $data); // Logs to 'id1'
$newIdent = 'id2';
$logger->openlog($newIdent, LOG_PID, LOG_USER);
$data = 'test2';
syslog(LOG_DEBUG, $data); // Logs to 'id2'
$logger->closelog();
$data = 'test3';
syslog(LOG_DEBUG, $data); // Logs to 'id1'
$logger->closelog();
$data = 'test4';
syslog(LOG_DEBUG, $data); // Logs to the default ident
$logger->closelog();
我很确定答案是无法获取当前活动的ident
的值。它作为一个“基本全局”保存在php中,看起来只写给我。最好的解决方案可能是为openlog/closelog制作自己的包装器,适当地跟踪ident
。