2011-09-15 29 views
10

Tại dự án hiện tại của tôi có hàng ngàn dòng mã mà trông như thế này:Redefining gốc khai thác gỗ logger

logging.info("bla-bla-bla") 

Tôi không muốn thay đổi tất cả những dòng này, nhưng tôi sẽ thay đổi hành vi log. Ý tưởng của tôi đang thay đổi logger gốc để Experimental logger khác, mà được cấu hình bởi ini file:

[loggers] 
keys = Experimental 

[formatter_detailed] 
format = %(asctime)s:%(name)s:%(levelname)s %(module)s:%(lineno)d: %(message)s 

[handler_logfile] 
class = FileHandler 
args = ('experimental.log', 'a') 
formatter = detailed 

[logger_Experimental] 
level = DEBUG 
qualname = Experimental 
handlers = logfile 
propagate = 0 

Bây giờ thiết lập các logger gốc mới được thực hiện bằng đoạn mã này:

logging.config.fileConfig(path_to_logger_config) 
logging.root = logging.getLogger('Experimental') 

là xác định lại của root logger an toàn? Có lẽ có cách thuận tiện hơn?

Tôi đã cố gắng sử dụng google và xem qua các câu hỏi về lưu lượng truy cập, nhưng tôi không tìm thấy câu trả lời.

+0

Đầu tiên. Công việc này có hiệu quả không? Bạn có một vấn đề thực tế? Thứ hai. Xác định "thuận tiện hơn" Hai dòng mã có vẻ rất thuận tiện. Bạn có thể tưởng tượng ra sao? –

+0

Nó hoạt động! Nhưng tôi nghi ngờ, điều này trông giống như một hack. "Thuận tiện hơn" có nghĩa là: "sử dụng một số tính năng tiêu chuẩn của mô-đun đăng nhập". Lấy làm tiếc. –

+0

Người đàn ông tốt! Định dạng thật tuyệt vời. –

Trả lời

11

Bạn được khuyên không để xác định lại trình ghi nhật ký theo cách bạn mô tả. Nói chung, bạn chỉ nên sử dụng logger gốc trực tiếp cho các kịch bản nhỏ - cho các ứng dụng lớn hơn, thực hành tốt nhất là sử dụng

logger = logging.getLogger(__name__) 

trong mỗi module, nơi bạn sử dụng khai thác gỗ, và sau đó thực hiện cuộc gọi đến logger.info() vv

Nếu tất cả những gì bạn muốn làm là đăng nhập vào một tệp, tại sao không chỉ thêm trình xử lý tệp vào trình ghi nhật ký gốc? Bạn có thể thực hiện bằng cách sử dụng ví dụ:

if __name__ == '__main__': 
    logging.basicConfig(filename='experimental.log', filemode='w') 
    main() # or whatever your main entry point is called 

hoặc thông qua tệp cấu hình.

Cập nhật: Khi tôi nói "bạn được khuyên", tôi có ý kiến ​​của tôi, ở đây trong câu trả lời này ;-) Trong khi bạn không gặp phải bất kỳ sự cố nào trong kịch bản của mình, thực hành không tốt để ghi đè mô-đun thuộc tính chưa được thiết kế để ghi đè. Ví dụ, trình ghi nhật ký gốc là một cá thể của một lớp khác (không phải là một phần của API công khai), và có các tham chiếu khác tới nó trong máy móc ghi nhật ký vẫn trỏ đến giá trị cũ. Một trong những sự kiện này có thể dẫn đến các sự cố khó gỡ lỗi. Vì gói ghi nhật ký cho phép một số cách để đạt được những gì bạn muốn (dường như, ghi vào một tệp chứ không phải bàn điều khiển), thì bạn nên sử dụng các cơ chế đó đã được cung cấp.

+0

"Bạn được khuyên ..." Ở đâu? Vấn đề là gì? Phần còn lại của câu trả lời "Nói chung ..." là tuyệt vời.Nhưng câu đầu tiên đó sẽ được hưởng lợi từ một số bằng chứng hoặc tài liệu hỗ trợ. –

+0

'logging.root' là của lớp' logging.RootLogger', không phải là 'logging.Logger'. Các lớp này chủ yếu hoạt động theo cùng một cách, nhưng bạn có thể gặp phải một hành vi khác trong một số trường hợp. Và một số loại kiểm tra có thể tăng cảnh báo là tốt. – DarksteelPenguin

1

logger = logging.getLogger() Để trống tên sẽ trả về trình ghi nhật ký gốc.

logger = logging.getLogger('name') Cung cấp cho bạn một trình ghi nhật ký khác.

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