Hôm nay tôi đã suy nghĩ về một dự án Python tôi đã viết về một năm trở lại, nơi tôi sử dụng logging
khá rộng rãi. Tôi nhớ phải bình luận ra rất nhiều cuộc gọi đăng nhập trong các tình huống giống như vòng lặp bên trong (mã 90%) vì chi phí (hotshot
cho biết đó là một trong những nút cổ chai lớn nhất của tôi).Làm cách nào để loại bỏ các cuộc gọi ghi nhật ký bằng Python mà không nhận xét chúng?
Tôi tự hỏi bây giờ nếu có một số cách hợp pháp để lập trình loại bỏ các cuộc gọi đăng nhập trong các ứng dụng Python mà không cần bình luận và bỏ ghi chú mọi lúc. Tôi nghĩ rằng bạn có thể sử dụng kiểm tra/biên dịch lại hoặc thao tác bytecode để làm một cái gì đó như thế này và chỉ nhắm mục tiêu các đối tượng mã đang gây tắc nghẽn. Bằng cách này, bạn có thể thêm một thao túng như một bước sau biên soạn và sử dụng một tập tin cấu hình tập trung, như vậy:
[Leave ERROR and above]
my_module.SomeClass.method_with_lots_of_warn_calls
[Leave WARN and above]
my_module.SomeOtherClass.method_with_lots_of_info_calls
[Leave INFO and above]
my_module.SomeWeirdClass.method_with_lots_of_debug_calls
Tất nhiên, bạn muốn sử dụng một cách tiết kiệm và có lẽ với granularity mỗi chức năng - chỉ cho các đối tượng mã đã hiển thị logging
là một nút cổ chai. Có ai biết bất cứ điều gì như thế này không?
Lưu ý: Có một vài điều khiến việc này trở nên khó thực hiện hơn nhờ tính năng nhập động và ràng buộc trễ. Ví dụ: bất kỳ cuộc gọi nào đến phương thức có tên debug
có thể phải được bao bọc bằng if not isinstance(log, Logger)
. Trong mọi trường hợp, tôi giả sử tất cả các chi tiết nhỏ có thể được khắc phục, hoặc bằng thỏa thuận của một quý ông hoặc một số kiểm tra thời gian chạy. :-)
bạn có sử dụng cùng một logger gốc cấp? tức là, logging.getLogger()? Nếu vậy, bạn cần sửa lỗi đó trước. Nếu không, vui lòng cung cấp một số lệnh gọi getLogger trong các mô-đun đó. –
@ S.Lott: Tôi sử dụng LOG = logging.getLogger (__ name__) trên cơ sở mỗi mô-đun, sau đó gọi LOG.debug (msg) và tương tự. Tôi không thực sự thấy nó có liên quan như thế nào. – cdleary