2013-07-08 28 views
10

Tôi muốn sử dụng trình xử lý đăng nhập StreamHandler của python. Những gì tôi đã thử là,Python: logging.streamhandler không gửi nhật ký tới stdout

import logging 
import sys 
mylogger = logging.getLogger("mylogger") 
h1 = logging.StreamHandler(stream=sys.stdout) 
h1.setLevel(logging.DEBUG) 

mylogger.addHandler(h1) 

# now trying to log with the created logger 
mylogger.debug("abcd") # <no output> 
mylogger.info("abcd") # <no output> 
mylogger.warn("abcd") # abcd 

Tôi đang thiếu cái gì? Hay làm gì sai? Tại sao nhật ký mức INFO và DEBUG không xuất hiện trên STDOUT?

Trả lời

16

Bạn phải thiết lập mức độ của logger, không chỉ mức độ xử lý:

mylogger.setLevel(logging.DEBUG) 

Đây là một hình ảnh tốt đẹp của công việc khai thác gỗ, nơi bạn có thể thấy rằng một trong hai logger và xử lý kiểm tra mức độ log:

http://docs.python.org/2/howto/logging.html#logging-flow

Giá trị mặc định là logLevelWARNING, vì vậy ngay cả khi bạn thiết lập các mức độ xử lý của bạn để DEBUG, thông báo sẽ không nhận được thông qua, kể từ khi logger của bạn ngăn chặn nó (nó cũng theo mặc định WARNING).

Bằng cách này, bạn có thể làm một số định dạng cơ bản với Formatter:

import logging 
import sys 

mylogger = logging.getLogger("mylogger") 

formatter = logging.Formatter('[%(levelname)s] %(message)s') 

handler = logging.StreamHandler(stream=sys.stdout) 
handler.setFormatter(formatter) 
handler.setLevel(logging.DEBUG) 

mylogger.addHandler(handler) 
mylogger.setLevel(logging.DEBUG) 

mylogger.debug("This is a debug message.") 
mylogger.info("Some info message.") 
mylogger.warning("A warning.") 

sẽ cung cấp cho bạn sản lượng

[DEBUG] This is a debug message. 
[INFO] Some info message. 
[WARNING] A warning. 
+0

Tôi đang theo dõi một số tài liệu cơ bản, http: //docs.python. org/2/howto/logging.html # logging-advanced-tutorial Tài liệu nói setLevel về trình xử lý. Tài liệu này có sai không? –

+2

Không có gì sai, như bạn có thể thấy trong http://docs.python.org/2/howto/logging.html#logging-flow trình ghi nhật ký chuyển cuộc gọi ghi nhật ký tới trình xử lý của nó sau khi kiểm tra mức. Vì vậy, nếu mức của logger được đặt thành 'WARN', và một thông báo' DEBUG' sẽ đến, không có gì được thông qua. Nếu một thông báo trôi qua, trình ghi nhật ký đưa nó cho trình xử lý, cũng có một kiểu ghi "bộ lọc". – tamasgal

+0

Tại sao tôi phải đặt mức của trình ghi nhật ký nếu tôi đã đặt cấp của trình xử lý? tại sao thiết lập nó hai lần? điều đó dường như thừa. – ospider

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