Подтвердить что ты не робот

Php var_dump ($ object) или print_r ($ object) в файл журнала

Этот вопрос является общим, и я просто хотел бы знать, как сбрасывать объекты в файлы журналов. Чтобы прояснить ситуацию, я прорабатываю пример.

Я успешно использовал magento-наблюдателей для вызова методов, когда происходят определенные события. Например, я наблюдаю за тем, когда отгрузка сохраняется через:

<sales_order_shipment_save_after>

и я успешно вызываю метод. Я хотел бы захватить груз и просто выгрузить объект в файл журнала. например.

public function newShipment(Varien_Event_Observer $observer)
{
    $shipment = $observer->getEvent()->getShipment();
    $shipId = $shipment->getId();
    Mage::log("shipment ({$shipId}) created/saved", null, 'shipments.log');
    //trying to dump $shipment data into the log file
    Mage::log("({var_dump($shipment)}) ------", null, 'shipments.log');
    Mage::log("----------------------------", null, 'shipments.log');
}

Идентификатор отгрузки печатается в файле журнала просто отлично, но, очевидно, он не сбрасывает объект так, как я его хочу, поскольку код, который я написал, неверен.

Может ли кто-нибудь сказать мне, как я мог бы сбросить объект в файл журнала и, возможно, дать мне несколько советов по регистрации в целом?

Большое спасибо.

4b9b3361

Ответ 2

Mage::log(
    $object->debug(), //Objects extending Varien_Object can use this
    Zend_Log::DEBUG,  //Log level
    'my.log',         //Log file name; if blank, will use config value (system.log by default)
    true              //force logging regardless of config setting
);

Ответ 3

Чтобы иметь возможность использовать Mage::log(), необходимо выполнить некоторые условия:

  • Режим разработчика должен быть установлен на true
  • ведение журнала должно быть активировано в конфигурации системы.

Но вы также можете принудительно выполнить регистрацию, передав true как 4-й параметр в Mage::log().

Если выполняются все условия (или принудительное вхождение в журнал), вы должны найти свой файл журнала в var/log/shipping.log.

В качестве побочного примечания: объекты Magento имеют тенденцию быть огромными и обычно содержат тонны информации, которые вам обычно не нужны для ведения журнала/отладки.

Вы можете уменьшить количество сбрасываемой информации с помощью метода getData(), члена всех объектов Magento, расширяющих Varien_Object:

Mage::log(print_r($shipment->getData(), true), null, 'shipment.log', true);

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

Mage::log((string) $shipment->getId(), null, 'shipment.log', true);

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

Mage::log($shipment->debug(), null, 'shipment.log', true);

Если вы не можете заставить Mage::log() работать, вы также можете использовать функцию PHP core error_log для регистрации. Это то, что я иногда делаю, если мне нужен только быстрый журнал.

error_log(print_r($shipment->getData(), true), 3, 'shipment.log');

Ответ 4

Возможно, вы использовали бы var_export(), например:

var_export($shipment, 1); // to return the string without sending it to STDOUT

Также глобальные функции нельзя вызывать непосредственно в строке с двумя кавычками. В твоем случае, Mage::log(var_export($shipment, 1) . '------', null, 'shipments.log') было бы нормально, я думаю. )

Если объект, который вы пытаетесь создать дамп, содержит циклические ссылки, var_export() не удастся. Затем вы можете использовать var_dump + ob_start/ob_flush combo (есть несколько примеров на странице var_dump() doc) или использовать альтернативный маршрут с serialize().