这个问题是通用的,我只想知道如何将对象转储到日志文件。为了澄清事情,我正在通过一个例子进行阐述。
我已成功使用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');
}
货件ID很好地打印到日志文件中,但显然它不会按照我想要的方式转储对象,因为我写的代码是错误的。
有人能告诉我如何将对象转储到日志文件中,并且可能会给我一些关于日志记录的建议吗?
非常感谢。答案 0 :(得分:27)
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
);
答案 1 :(得分:22)
为了能够使用Mage::log()
,需要满足一些条件:
true
但是,您也可以通过将true
作为第4个参数传递给Mage::log()
来强制记录。
如果满足所有条件(或强制记录),您应该在var/log/shipping.log
中找到您的日志文件。
作为旁注:Magento对象往往是 large ,并且通常包含大量您通常不需要进行日志记录/调试的信息。
您可以使用getData()
方法减少转储信息量,Varien_Object
方法是扩展Mage::log(print_r($shipment->getData(), true), null, 'shipment.log', true);
的所有Magento对象的成员:
Mage::log((string) $shipment->getId(), null, 'shipment.log', true);
您还可以使用正确的getter方法转储单个属性:
debug()
如果你确实需要完整的对象转储,我建议使用对象的Mage::log($shipment->debug(), null, 'shipment.log', true);
方法来记录数据(这种方法自动检测递归,这有助于避免无休止的循环吃掉所有记忆):
Mage::log()
如果无法使error_log
工作,您可以使用PHP的核心error_log(print_r($shipment->getData(), true), 3, 'shipment.log');
函数进行记录。如果我只需要快速记录,那就是我有时会这样做的。
{{1}}
答案 2 :(得分:10)
如果您处于开发者模式,则可以尝试通过$object->debug()
对象支持调试输出。
答案 3 :(得分:7)
也许您会使用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 page有几个例子),或者使用serialize()函数的替代路由。