2010-11-10 43 views
20

Một nơi nào đó trong lòng của mã của tôi, tôi có một cái gì đó như:phân cấp ghi nhật ký so với trình ghi nhật ký gốc?

logger = logging.getLogger('debug0.x') 

Con đường tôi hiểu nó, điều này cần chỉ phản ứng khi trước đây tôi đã làm một cái gì đó như:

logging.basicConfig(filename='10Nov2010a.txt',level=logging.DEBUG, name='debug0') 

lưu ý rằng tên đã được xác định là debug0. Tuy nhiên, tôi đã phát hiện ra rằng nếu làm

logging.basicConfig(filename='10Nov2010a.txt',level=logging.DEBUG) 

mà không tên từ khóa, sau đó các debug0.x logger định nghĩa ở trên phản ứng, và ghi vào file log. Tôi đã nghĩ rằng nó sẽ chỉ phản ứng trong trường hợp đầu tiên, khi logger đã được đặt tên.

Tôi đang bối rối.

+3

['logging.basicConfig()'] (http://docs.python.org/library/logging.html#logging.basicConfig) không có đối số từ khóa 'name'. –

Trả lời

52

Các Python logging mô-đun tổ chức logger trong một hệ thống phân cấp. Tất cả logger là con cháu của logger gốc. Mỗi logger gửi thông điệp tường trình cho cha mẹ của nó.

Trình ghi nhật ký mới được tạo bằng hàm getLogger(). Các chức năng gọi logging.getLogger('debug0.x') tạo ra một logger x đó là một đứa trẻ của debug0 mà chính nó là một đứa trẻ của logger gốc. Khi đăng nhập vào trình ghi nhật ký này, nó sẽ truyền thông báo cho cha của nó, và cha mẹ của nó sẽ truyền thông điệp tới bộ ghi gốc. Bạn đã định cấu hình trình ghi nhật ký gốc để đăng nhập vào một tệp theo chức năng basicConfig(), vì vậy thư của bạn sẽ kết thúc ở đó.

+0

Vậy thực hành tốt nhất để nhận logger bằng Python là gì? Trong Java, bạn chỉ cần thực hiện 'getLogger (getClass(). GetName())' (hoặc một số phương thức tiện lợi 'getLogger (getClass())', đại diện cho phương thức khác mà tôi đã đề cập). Chúng ta nên sử dụng gì trong Python? Chắc chắn chúng ta không phải tạo ra một số ID của trình ghi nhật ký và tự cắm nó vào cho mỗi mô-đun chúng ta tạo ra. –

+2

@Garret Cách tiếp cận phổ biến nhất trong Python là sử dụng 'logger = logging.getLogger (__ name __) 'ở đầu mỗi mô-đun. Biến '__name__' chứa tên chấm của mô-đun hiện tại. –

+1

Bất kỳ lý do nào tại sao phương pháp hay nhất không sử dụng '_logger' để biến không được hiển thị khi mô-đun được nhập? –

10

Nếu bạn kiểm tra mã hoặc doc:

>>> print logging.basicConfig.__doc__ 

    Do basic configuration for the logging system. 

    This function does nothing if the root logger already has handlers 
    configured. ............... 
    A number of optional keyword arguments may be specified, which can alter 
    the default behaviour. 

    filename Specifies that a FileHandler be created, using the specified 
       filename, rather than a StreamHandler. 
    filemode Specifies the mode to open the file, if filename is specified 
       (if filemode is unspecified, it defaults to 'a'). 
    format Use the specified format string for the handler. 
    datefmt Use the specified date/time format. 
    level  Set the root logger level to the specified level. 
    stream Use the specified stream to initialize the StreamHandler. Note 
       that this argument is incompatible with 'filename' - if both 
       are present, 'stream' is ignored. 

logging.basicConfig không sử dụng lập luận tên nào cả. Nó khởi tạo bộ ghi gốc. Trong khi getLogger mất một "tên" lập luận

>>> print logging.getLogger.__doc__ 

    Return a logger with the specified name, creating it if necessary. 

    If no name is specified, return the root logger. 
Các vấn đề liên quan