我们如何使用Zend_Log将消息作为数组传递

时间:2009-08-11 03:22:44

标签: zend-framework

我使用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

5 个答案:

答案 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()的行和文件信息。

http://de2.php.net/manual/en/function.debug-backtrace.php

答案 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