Как мы можем передать сообщение в виде массива, используя Zend_Log - PullRequest
1 голос
/ 11 августа 2009

Я использую Zend_Log для создания и регистрации сообщений. Он хорошо работает для хранения сообщений журнала в поток (новое определенное имя файла), и я хочу сохранить эти сообщения в массив буфера.

Для этого я посещаю: http://framework.zend.com/wiki/display/ZFPROP/Zend_Log+Rewrite#Zend_LogRewrite-1.Overview но не получить свои очки .............

Спасибо: Роб Найт

Но я хочу кое-что как;

Если я напишу $ logger-> info («Информационное сообщение»); в любой строке моего .php-файла сообщение, которое будет отображаться, должно содержать текст сообщения вместе с номером строки.

Предположим, я пишу $ logger-> info ('Имя уже существует'); в строке 116 моего файла test.php. Тогда результат Log должен быть таким: ИНФОРМАЦИЯ: «Имя уже существует», строка: 116, файл: test.php

Ответы [ 5 ]

2 голосов
/ 16 февраля 2010

Вот выстрел в это. С этим методом вам не нужно писать какие-либо глобальные служебные функции. Вы можете использовать интерфейс 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);

В пользовательском модуле записи пройдите обратный след и найдите первый класс, не связанный с вашими библиотеками журналирования. Вероятно, есть более элегантный способ написания этой части, но, похоже, она работает в моей среде (я буду голосовать за любые хорошие предложения). Когда вы найдете нужный элемент в обратном следе, добавьте его в массив событий и затем вызовите метод записи родителя. Если вы правильно инициализировали модуль форматирования, он запишет значения событий в строку журнала.

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);
    }
0 голосов
/ 25 февраля 2012

Я добавил / изменил класс 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
0 голосов
/ 11 августа 2009

Думаю, вам придется написать своего автора для этой функции. Вы можете использовать debug_backtrace, чтобы увидеть, где $ logger-> info () для строки и информации о файле.

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

0 голосов
/ 04 января 2010

Вот как я решил ту же проблему, но вам нужно абстрагироваться от вызова журналирования, который в любом случае спасет вас от ввода

в вашем 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>
0 голосов
/ 11 августа 2009

Использование 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 для регистрации сообщений, передавая экземпляр регистратора, который мы подготовили ранее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...