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
  • ロギングは、システム構成でアクティブ化する必要があります。

ただし、4番目のパラメータとしてに渡すことでログを強制することもできます。trueMage::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 に答える