2012-11-01 41 views
16

Tôi đang làm việc với Django-nonrel trên Google App Engine, điều này buộc tôi phải sử dụng logging.debug() thay vì print().Python- Làm cách nào để xóa nhật ký? (django)

Mô-đun "ghi nhật ký" được cung cấp bởi Django, nhưng tôi có thời gian sử dụng nó thay vì in().

Ví dụ: nếu tôi cần xác minh nội dung được giữ trong biến x, tôi sẽ đặt
logging.debug('x is: %s' % x). Nhưng nếu chương trình bị treo ngay sau đó (không xả luồng), thì nó sẽ không bao giờ được in ra.

Vì vậy, để gỡ lỗi, tôi cần gỡ lỗi() để được xóa trước khi chương trình thoát khỏi lỗi và điều này không xảy ra.

+0

không phải là câu trả lời cho câu hỏi của bạn nhưng tại sao bạn lại sử dụng 'in'? – aschmid00

+1

Chính xác bạn có ý gì khi "xóa" nhật ký? –

+0

Hy vọng ví dụ được liệt kê sẽ giúp hiểu rõ hơn. – Rucent88

Trả lời

9

Tôi nghĩ rằng điều này có thể làm việc cho bạn, giả sử bạn chỉ sử dụng bộ xử lý một (hoặc mặc định):

>>> import logging 
>>> logger = logging.getLogger() 
>>> logging.debug('wat wat') 
>>> logger.handlers[0].flush() 

Nó loại tán thành trong tài liệu, mặc dù.

Mã ứng dụng không được khởi tạo trực tiếp và sử dụng các phiên bản của Trình xử lý. Thay vào đó, lớp Handler là một lớp cơ sở định nghĩa giao diện mà tất cả các trình xử lý phải có và thiết lập một số hành vi mặc định mà các lớp con có thể sử dụng (hoặc ghi đè). http://docs.python.org/2/howto/logging.html#handler-basic

Và nó có thể là hiệu suất thoát, nhưng nếu bạn thực sự gặp khó khăn, điều này có thể giúp gỡ lỗi của bạn.

+1

Uh, mọi người phải xả sạch nhật ký của họ như thế nào nếu cách duy nhất là thông qua trình xử lý mà bạn không được phép truy cập? Điều đó nghe có vẻ bị hỏng. –

+1

Không, đó không phải là tất cả những gì tài liệu nói. Trích dẫn ở trên có nghĩa là bạn chỉ nên khởi tạo và sử dụng * lớp con * của Handler, thay vì Handler trực tiếp. Mã của bạn chỉ sử dụng bất kỳ lớp trình xử lý nào đã được người khác khởi tạo, do đó không có vấn đề gì. – Hjulle

+3

Thực sự hữu ích; Tôi vẫn thấy nó cực kì lạ lùng đến mức tôi không thể nói với logger ngu ngốc trong cấu hình của nó rằng nó luôn luôn tuôn ra; nhưng mã khách hàng của tôi phải thực thi điều đó. – GhostCat

5

Ghi nhật ký Django dựa trên mô-đun ghi nhật ký python chuẩn.

Module này có một phương pháp mô-đun cấp: logging.shutdown() mà xả tất cả các bộ xử lý và tắt các hệ thống khai thác gỗ (tức là khai thác gỗ có thể không còn được sử dụng sau khi nó được gọi là)

Kiểm tra mã của chức năng này chương trình hiện (python 2.7) module đăng nhập giữ một danh sách các tài liệu tham khảo yếu cho tất cả các bộ xử lý trong một biến mô-đun cấp gọi _handlerList vì vậy tất cả các bộ xử lý có thể được rửa bằng cách làm một cái gì đó giống như

[h_weak_ref().flush() for h_weak_ref in logging._handlerList] 

vì giải pháp này sử dụng nội bộ của mô-đun @Mike giải pháp trên là tốt hơn, nhưng nó rel ies trên có quyền truy cập vào một logger, nó có thể được khái quát như sau:

[h.flush() for h in my_logger.handlerList] 
1

Nếu trường hợp sử dụng là bạn có một chương trình python nên tuôn bản ghi của nó khi thoát, sử dụng logging.shutdown().

Từ các tài liệu python:

logging.shutdown()

Thông báo cho các hệ thống đăng nhập để thực hiện một trật tự tắt máy bằng cách xả nước và đóng cửa tất cả các bộ xử lý. Điều này nên được gọi là khi thoát ứng dụng và không sử dụng thêm hệ thống ghi nhật ký nào phải là được thực hiện sau cuộc gọi này.

4

Tôi gặp khó khăn với một vấn đề tương tự và đây là cách tôi giải quyết nó.Thay vì sử dụng logging mô-đun trực tiếp đến sản lượng các bản ghi của bạn, khởi logger của bạn như sau:

import sys 
import logging 


def init_logger(): 
    logger = logging.getLogger() 

    h = logging.StreamHandler(sys.stdout) 
    h.flush = sys.stdout.flush 
    logger.addHandler(h) 

    return logger 

Sau đó, sử dụng nó thay vì logging trong mã của bạn:

def f(): 
    logger = init_logger() 
    logger.debug('...') 

Kết quả là, bạn thắng' t có vấn đề với xả nhật ký nữa.

Các vấn đề liên quan