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

act*_*Dev 13 php magento

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

我已成功使用magento观察者在某些事件发生时调用方法.举个例子,我观察通过以下方式保存货件的时间:

<sales_order_shipment_save_after>
Run Code Online (Sandbox Code Playgroud)

我成功地调用了一种方法.我想抓住货物,然后将对象转储到日志文件中.例如.

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');
}
Run Code Online (Sandbox Code Playgroud)

货件ID被打印到日志文件中就好了,但显然它不会按照我想要的方式转储对象,因为我写的代码是错误的.

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

非常感谢.

ben*_*rks 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
);
Run Code Online (Sandbox Code Playgroud)


Jür*_*len 22

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

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

但是,你也可以通过传递第4个参数来强制记录.trueMage::log()

如果满足所有条件(或强制记录),您应该找到您的日志文件var/log/shipping.log.

作为旁注:Magento对象往往很大,通常包含大量的信息,通常您不需要进行日志记录/调试.

您可以使用该getData()方法减少转储信息量,该方法是所有Magento对象的成员Varien_Object:

Mage::log(print_r($shipment->getData(), true), null, 'shipment.log', true);
Run Code Online (Sandbox Code Playgroud)

您还可以使用正确的getter方法转储单个属性:

Mage::log((string) $shipment->getId(), null, 'shipment.log', true);
Run Code Online (Sandbox Code Playgroud)

如果你真的需要完整的对象转储,我建议使用debug()对象的方法来记录数据(这个方法自动检测递归,这有助于避免无限循环占用所有内存):

Mage::log($shipment->debug(), null, 'shipment.log', true);
Run Code Online (Sandbox Code Playgroud)

如果你不能Mage::log()上班,你可以使用PHP的核心error_log功能来记录.如果我只需要快速记录,这就是我有时会做的.

error_log(print_r($shipment->getData(), true), 3, 'shipment.log');
Run Code Online (Sandbox Code Playgroud)


B00*_*MER 10

如果您处于开发者模式,则可以尝试该对象是否支持调试输出$object->debug().


rai*_*7ow 7

也许您会使用var_export()函数,如下所示:

var_export($shipment, 1); // to return the string without sending it to STDOUT
Run Code Online (Sandbox Code Playgroud)

此外,全局函数不能在双引号字符串中直接调用.在你的情况下 Mage::log(var_export($shipment, 1) . '------', null, 'shipments.log'),我想是的.)

如果您尝试转储的对象包含循环引用,则var_export()将失败.然后你可以使用var_dump + ob_start/ob_flush combo(在var_dump()doc页面上有几个例子),或者使用serialize()函数获取备用路由.