Этот вопрос является общим, и я просто хотел бы знать, как сбрасывать объекты в файлы журналов. Чтобы прояснить ситуацию, я прорабатываю пример.
Я успешно использовал 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'); }
Идентификатор отгрузки печатается в файле журнала просто отлично, но, очевидно, он не сбрасывает объект так, как я его хочу, поскольку код, который я написал, неверен.
Может ли кто-нибудь сказать мне, как я могу сбросить объект в файл журнала и, возможно, дать мне несколько советов по регистрации в целом?
Огромное спасибо.
Если вы находитесь в режиме разработчика, вы можете попробовать, если объект поддерживает отладочный вывод через $object->debug()
.
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 );
Чтобы иметь возможность использовать 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()
работать, вы также можете использовать функцию error_log
PHP для регистрации. Это то, что я иногда делаю, если мне нужен только быстрый журнал.
error_log(print_r($shipment->getData(), true), 3, 'shipment.log');
Возможно, вы использовали бы функцию 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 () есть несколько примеров) или использовать альтернативный маршрут с функцией serialize () .