我使用Zend_Log创建和记录消息。 它适用于将日志消息存储到流中(新定义的文件名),我想将这些消息存储到缓冲区数组中。
为此我访问: http://framework.zend.com/wiki/display/ZFPROP/Zend_Log+Rewrite#Zend_LogRewrite-1.Overview 但没有得到他们的观点.............
谢谢:Rob Knight
但我想要一些像这样的东西;
如果我写$ logger-> info('信息消息');在我的.php文件的任何一行中,将显示的消息必须包含消息文本和行号。
让我想一想 $ logger-> info('名称已存在'); 在我的test.php文件的第116行。 那么结果Log必须如下: 信息:“名称已存在”,行:116,文件:test.php
答案 0 :(得分:2)
这是一个镜头。使用此方法,您无需编写任何全局实用程序函数。您可以使用Zend_Log接口进行所有方法调用。
在您的引导程序中,初始化您的记录器。确保在格式化程序中包含文件和行事件类型。然后,使用自定义编写器创建Logger,它将在运行时设置文件和行事件类型的值。
$format = '%file% %line% %message%' . PHP_EOL;
$formatter = new Zend_Log_Formatter_Simple($format);
$writer = new My_Log_Writer_Stream('file://' . $traceLogPath);
$writer->setFormatter($formatter);
$log = new Zend_Log($writer);
在自定义编写器中,浏览回溯并找到与日志记录库无关的第一个类。写这篇文章可能有一种更优雅的方式,但它似乎适用于我的环境(我会投票给你任何好的建议)。在回溯中找到所需项目后,将其添加到事件数组中,然后调用父项的write方法。如果您已正确初始化格式化程序,它会将事件值写入日志字符串。
class My_Log_Writer_Stream extends Zend_Log_Writer_Stream {
protected function _write($event) {
$backtrace = debug_backtrace();
foreach($backtrace as $traceItem) {
$class = $traceItem['class'];
if(!is_subclass_of($class, 'Zend_Log') &&
!is_subclass_of($class, 'Zend_Log_Writer_Abstract') &&
$class !== 'Zend_Log' &&
$class !== 'Zend_Log_Writer_Abstract') {
break;
}
}
$event['file'] = $traceItem['file'];
$event['line'] = $traceItem['line'];
parent::_write($event);
}
答案 1 :(得分:0)
使用Zend_Log_Writer_Mock
。您链接到上面的文档页面不是Zend_Log的实际手册页面 - 按照我的链接,您将获得完整的文档。
用法:
$logger = new Zend_Log();
$writer = new Zend_Log_Writer_Mock();
$logger->addWriter($writer);
$logger->info('My message');
// access messages via $writer->events
要包含文件名和行号,请执行以下操作:
function LogMessage($logger, $message, $line, $file) {
$logger->write("INFO: {$message} at line {$line} of file {$file}");
}
LogMessage($logger, 'Informational message', __LINE__, __FILE__);
只需调用LogMessage函数来记录消息,传入我们之前准备的记录器实例。
答案 2 :(得分:0)
我认为你必须为这个功能编写自己的作家。您可以使用debug_backtrace查看$ logger-> info()的行和文件信息。
答案 3 :(得分:0)
以下是我解决同样问题的方法,但您需要抽象出日志调用,它可以保存您输入
你的bootstrap.php中的
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
protected function _initLogging() {
$log = new Zend_Log();
$writer_log = new Zend_Log_Writer_Stream(APPLICATION_PATH.'/../logs/'.APPLICATION_ENV.'.log');
$formatter = new Zend_Log_Formatter_Xml();
$writer_log->setFormatter($formatter);
$log->addWriter($writer_log);
Zend_Registry::set('logger', $log);
}
}
以及具有全球范围的地方
function debug($message, $level = Zend_Log::DEBUG) {
$backtrace = debug_backtrace();
Zend_Registry::get('logger')->setEventItem('file', $backtrace[1]['file']);
Zend_Registry::get('logger')->setEventItem('class', $backtrace[1]['class']);
Zend_Registry::get('logger')->setEventItem('function', $backtrace[1]['function']);
Zend_Registry::get('logger')->setEventItem('line', $backtrace[1]['line']);
Zend_Registry::get('logger')->log($message, $level);
}
$ backtrace数组中的偏移量是使用上面调用的函数,如果需要查看其他地方,请查看debug_backtrace的输出
它像这样使用
class SomeClass {
function func {
debug("Message");
}
}
并像这样(添加格式)
<logEntry>
<timestamp>2010-01-01T00::00+00:00</timestamp>
<message>Message</message>
<priority>7</priority>
<priorityName>DEBUG</priorityName>
<class>SomeClass</class>
<function>func</function>
<line>2</line>
</logEntry>
答案 4 :(得分:0)
我添加/更改为My_Log_Writer_Stream类如下:
$event['file'] = basename($traceItem['file']); // only the filename when path is too long
$event['pid']= getmypid(); // process ID
所以,那样我的Zend_Log_Formatter_Simple格式是
format='%timestamp% [%pid%] %priorityName% :%file%:%line%:%message%'.PHP_EOL