php var_dump($ object)或print_r($ object)到日志文件

时间:2012-04-30 14:05:21

标签: php magento

这个问题是通用的,我只想知道如何将对象转储到日志文件。为了澄清事情,我正在通过一个例子进行阐述。

我已成功使用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很好地打印到日志文件中,但显然它不会按照我想要的方式转储对象,因为我写的代码是错误的。

有人能告诉我如何将对象转储到日志文件中,并且可能会给我一些关于日志记录的建议吗?

非常感谢。

4 个答案:

答案 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()函数的替代路由。