2012-04-30 33 views
12

Câu hỏi này là chung chung và tôi chỉ muốn biết cách kết xuất đối tượng để ghi tệp. Để làm rõ mọi thứ, tôi đang xây dựng thông qua một ví dụ.

Tôi đã sử dụng thành công các nhà quan sát magento để gọi các phương pháp khi một số sự kiện xảy ra. Như một ví dụ, tôi đang quan sát khi một lô hàng được lưu thông qua:

<sales_order_shipment_save_after> 

và tôi đang kêu gọi thành công một phương pháp. Tôi muốn lấy lô hàng và chỉ đơn giản là đổ vật thể vào một tệp nhật ký. ví dụ.

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 lô hàng được in vào tệp nhật ký tốt, nhưng rõ ràng là không đổ đối tượng theo cách tôi muốn làm mã tôi đã viết sai.

Bất cứ ai có thể cho tôi biết cách tôi có thể đổ một đối tượng vào tệp nhật ký và có thể cho tôi một số lời khuyên về việc đăng nhập chung không?

cảm ơn rất nhiều.

Trả lời

7

Có lẽ bạn muốn sử dụng var_export() chức năng thay vào đó, như thế này:

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

Ngoài chức năng toàn cầu không thể được gọi trực tiếp trong chuỗi dụng dấu ngoặc kép. Trong trường hợp của bạn, Mage::log(var_export($shipment, 1) . '------', null, 'shipments.log') sẽ ổn, tôi đoán vậy.)

Nếu đối tượng bạn đang cố gắng đổ chứa tham chiếu vòng tròn, var_export() sẽ không thành công. Sau đó, bạn có thể sử dụng tổ hợp var_dump + ob_start/ob_flush (có một số ví dụ tại số var_dump() doc page) hoặc theo một tuyến đường thay thế với hàm serialize().

+0

Chỉ cần lưu ý rằng var_export được gọi trong cuộc gọi nhật ký Mage :: cũng phải lấy 1 làm đối số. – ben

+0

Bình luận tuyệt vời, cảm ơn bạn.) Đã sửa câu trả lời. – raina77ow

+0

cảm ơn bạn đã trả lời. tôi đã thử câu trả lời của bạn và tôi nhận được lỗi sau thay vì kết quả mong đợi: – 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

Để có thể sử dụng Mage::log(), một số điều kiện cần phải được đáp ứng:

  • chế độ nhà phát triển phải được thiết lập để true
  • khai thác gỗ phải được kích hoạt trong cấu hình hệ thống.

Tuy nhiên, bạn cũng có thể lực đăng nhập bằng cách đi qua true param như 4 đến Mage::log().

Nếu đáp ứng tất cả các điều kiện (hoặc ghi nhật ký), bạn nên tìm tệp nhật ký của mình theo số var/log/shipping.log.

Lưu ý: Các đối tượng Magento có xu hướng là lớn và thường chứa nhiều thông tin mà bạn thường không thực sự cần cho mục đích ghi/gỡ lỗi.

Bạn có thể giảm số lượng thông tin đổ bằng cách sử dụng phương pháp getData(), một thành viên của tất cả các đối tượng Magento mở rộng Varien_Object:

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

Bạn cũng có thể đổ thuộc tính duy nhất bằng cách sử dụng phương pháp getter thích hợp của nó:

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

Nếu bạn thực sự cần đầy đủ bãi đối tượng, tôi khuyên bạn nên sử dụng phương thức debug() của đối tượng để ghi dữ liệu (phương pháp này tự động sửa cts recursions đó giúp tránh các vòng lặp vô tận ăn lên tất cả các bộ nhớ):

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

Nếu bạn không thể nhận Mage::log() để làm việc, bạn có thể sử dụng cách khác chức năng cốt lõi error_log PHP để đăng nhập. Đó là những gì tôi đôi khi làm, nếu tôi chỉ cần một bản ghi nhanh.

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

tuyệt vời. đây là thông tin tuyệt vời. im kinda mới để SO và im không chắc chắn những gì các nghi thức. bạn cung cấp câu trả lời toàn diện và hữu ích nhất nhưng một người dùng khác đã giúp tôi thực sự đổ đối tượng vào tệp nhật ký trước tiên. tôi đã đánh dấu đó là câu trả lời. xin lỗi vì câu hỏi ngớ ngẩn nhưng tôi không chắc chắn những gì và những gì không được thực hiện trong cộng đồng. dù sao, cảm ơn rất nhiều vì câu trả lời này! – activeDev

+0

Vui vì nó đã giúp ^^. Các nghi thức nói, nó hoàn toàn tùy thuộc vào bạn có bao nhiêu câu trả lời cá nhân bạn muốn upvote và câu trả lời mà bạn muốn chấp nhận. –