13

这个问题很笼统,我只想知道如何将对象转储到日志文件中。为了澄清事情,我通过一个例子来详细说明。

当某些事件发生时,我已经成功地使用 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

4 回答 4

28
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
);
于 2012-04-30T15:31:09.607 回答
22

要能够使用Mage::log(),需要满足一些条件:

  • 开发者模式必须设置为true
  • 必须在系统配置中激活日志记录。

但是,您也可以通过将第四true个参数传递给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 的核心error_log功能进行日志记录。如果我只需要一个快速日志,这就是我有时会做的事情。

error_log(print_r($shipment->getData(), true), 3, 'shipment.log');
于 2012-04-30T15:34:08.470 回答
10

如果您处于开发人员模式,您可以尝试该对象是否支持通过$object->debug().

于 2012-04-30T14:50:52.730 回答
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 组合(在var_dump() 文档页面中有几个示例),或者使用serialize()函数采用替代路线。

于 2012-04-30T14:09:09.620 回答