这个问题是通用的,我只想知道如何将对象转储到日志文件.为了澄清事情,我正在通过一个例子进行阐述.
我已成功使用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)
也许您会使用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()函数获取备用路由.