2012-04-30 17 views
12

Esta pregunta es genérica, y me gustaría simplemente saber cómo volcar objetos a los archivos de registro. Para aclarar cosas, estoy elaborando a través de un ejemplo.

He estado utilizando con éxito los observadores de magento para llamar a los métodos cuando ocurren ciertos eventos. A modo de ejemplo, que estoy observando para cuando un envío se guarda a través de:

<sales_order_shipment_save_after> 

y yo estoy llamando a un método con éxito. Me gustaría tomar el envío y simplemente volcar el objeto a un archivo de registro. p.ej.

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'); 
} 

La Identificación del cargamento se imprime en el archivo de registro muy bien, pero es obvio que no volcar el objeto de la manera que yo quiero que como el código que he escrito es incorrecto.

¿Alguien puede decirme cómo podría volcar un objeto a un archivo de registro y tal vez darme algunos consejos sobre el inicio de sesión en general?

muchas gracias.

Respuesta

7

Tal vez tendrá que utilizar la función var_export() en su lugar, como este:

var_export($shipment, 1); // to return the string without sending it to STDOUT 

también funciones globales no se pueden llamar directamente en cadena entre comillas dobles. En su caso, Mage::log(var_export($shipment, 1) . '------', null, 'shipments.log') estaría bien, supongo.)

Si el objeto que intentas volcar contiene referencias circulares, var_export() fallará. Luego puede usar var_dump + ob_start/ob_flush combo (hay varios ejemplos en el var_dump() doc page), o tomar una ruta alternativa con la función serialize().

+0

Solo tenga en cuenta que la var_export llamada dentro de la llamada de Mage :: log también debe tomar 1 como argumento. – ben

+0

Gran comentario, gracias.) Se corrigió la respuesta. – raina77ow

+0

gracias por la respuesta. He intentado con su respuesta y me aparece el siguiente error en lugar del resultado esperado: – activeDev

26
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 
); 
19

Para poder utilizar Mage::log(), algunas condiciones se deben cumplir:

  • modo de programador debe establecerse en true
  • registro debe ser activado en la configuración del sistema.

Pero, también puede fuerza tala pasando true como cuarto parámetro a Mage::log().

Si se cumplen todas las condiciones (o el registro es forzado), debe encontrar su archivo de registro en var/log/shipping.log.

Como nota al margen: los objetos de Magento tienden a ser enorme y generalmente contienen toneladas de información que generalmente no necesita para fines de registro y depuración.

Puede reducir la cantidad de información objeto de dumping utilizando el método getData(), un miembro de todos los objetos de Magento se extiende Varien_Object:

Mage::log(print_r($shipment->getData(), true), null, 'shipment.log', true); 

También puede volcar atributos individuales mediante el uso de su método de obtención adecuado:

Mage::log((string) $shipment->getId(), null, 'shipment.log', true); 

Si realmente necesita lleno volcados de objetos, yo recomendaría usar el método debug() del objeto para registrar los datos (este método se autodete) recurrencias cts lo que ayuda a evitar los bucles sin fin que comen toda la memoria):

Mage::log($shipment->debug(), null, 'shipment.log', true); 

Si no se puede conseguir Mage::log() al trabajo, se podrían utilizar alternativamente función básica error_log de PHP para iniciar la sesión. Eso es lo que a veces hago, si solo necesito un registro rápido.

error_log(print_r($shipment->getData(), true), 3, 'shipment.log'); 
+0

genial. esta es una información increíble. soy un poco nuevo en SO y no estoy seguro de lo que es la etiqueta. proporcionó la respuesta más completa y útil, pero otro usuario me ayudó a volcar el objeto en un archivo de registro primero. Ya lo he marcado como la respuesta. lo siento por la pregunta tonta, pero no estoy seguro de qué es y qué no se hace en la comunidad. de todos modos, muchas gracias por esta respuesta! – activeDev

+0

Me alegro de que haya ayudado ^^. La etiqueta dice, depende completamente de usted cuántas respuestas personalmente desea votar y qué respuesta desea aceptar. –

Cuestiones relacionadas