2009-12-22 43 views

Trả lời

37

Bạn có thể loại bỏ các xử lý mặc định và cấu hình lại đăng nhập như thế này:

# if someone tried to log something before basicConfig is called, Python creates a default handler that 
# goes to the console and will ignore further basicConfig calls. Remove the handler if there is one. 
root = logging.getLogger() 
if root.handlers: 
    for handler in root.handlers: 
     root.removeHandler(handler) 
logging.basicConfig(format='%(asctime)s %(message)s',level=logging.DEBUG) 
+1

Để được sử dụng nguyên văn. Nếu bạn-như tôi- cố gắng tái sử dụng một logger trước đó đã khởi tạo như thế này: 'logger = logging.getLogger (__ name __)' và cố gắng lặp trong 'logger.handlers' nó sẽ không hoạt động. –

+1

"Nếu root.handlers:" là gì? Lặp lại một chuỗi rỗng không có hiệu lực. Có thể root.handlers là một số giá trị sai khác không phải chuỗi không? (Nó không nằm trong hệ thống của tôi) – Sebastian

+0

Có ích cho việc gỡ lỗi đăng nhập với AWS Lambdas. Có vẻ như họ cài đặt một số trình xử lý với tên 'LambdaLoggingHandler' trong quá trình khởi động lambda. Loại bỏ trình xử lý đã cài đặt đã giải quyết được sự cố. –

9

Có.

Bạn đã yêu cầu đăng nhập nội dung nào đó. Do đó, việc ghi nhật ký phải tạo cấu hình mặc định. Sau khi đăng nhập được cấu hình ... tốt ... nó được cấu hình.

"Với đối tượng logger cấu hình, phương pháp sau đây tạo log thông điệp:"

Hơn nữa, bạn có thể đọc về việc tạo xử lý để ngăn chặn khai thác gỗ giả mạo. Nhưng đó là một hack cho thực hiện xấu hơn là một kỹ thuật hữu ích.

Có một mẹo để làm điều này.

  1. Không có mô-đun nào có thể làm bất kỳ điều gì ngoại trừ yêu cầu logging.getlogger() ở mức toàn cầu.

  2. Chỉ if __name__ == "__main__": mới có thể thực hiện cấu hình ghi nhật ký.

Nếu bạn ghi nhật ký ở mức toàn cầu, bạn có thể buộc đăng nhập để chế tạo cấu hình mặc định của nó.

Đừng làm logging.info trên toàn cầu trong bất kỳ mô-đun nào. Nếu bạn hoàn toàn nghĩ rằng bạn phải có logging.info ở mức toàn cầu trong mô-đun, thì bạn phải định cấu hình ghi nhật ký trước khi nhập. Điều này dẫn đến các tập lệnh khó chịu.

+1

Không, tôi đã sai - dường như điều này là do thiết kế như basicConfig được gọi từ .info et al để đảm bảo trình ghi nhật ký được cài đặt. Nó vẫn có vẻ như hành vi kỳ quặc đối với tôi. –

2

Dưới đây là một trong những mảnh ghép mà các câu trả lời ở trên không đề cập đến ... và sau đó tất cả nó sẽ làm cho rễ hiểu: "root" logger - được sử dụng nếu bạn gọi, nói, logging.info() trước khi logging.basicConfig (level = logging.DEBUG) - có mức ghi mặc định là WARNING.

Đó là lý do tại sao logging.info() và logging.debug() không làm bất cứ điều gì: vì bạn đã định cấu hình chúng không thành, bởi ... um ... không định cấu hình chúng.

Có thể liên quan (điều này một chút tôi): khi KHÔNG gọi basicConfig, tôi dường như không nhận được thông báo gỡ lỗi của mình, mặc dù tôi đã đặt trình xử lý của mình ở mức DEBUG. Sau khi một chút kéo tóc, tôi thấy bạn phải thiết lập mức độ tùy chỉnh logger để được DEBUG là tốt. Nếu logger của bạn được đặt thành CẢNH BÁO, thì việc đặt trình xử lý thành DEBUG (tự nó) sẽ không đưa bạn bất kỳ đầu ra nào trên logger.info() và logger.debug().

7

Câu trả lời này từ Carlos A. Ibarra về nguyên tắc đúng, tuy nhiên việc triển khai đó có thể xảy ra do bạn đang lặp qua danh sách có thể thay đổi bằng cách gọi removeHandler(). Điều này là không an toàn. Hai lựa chọn thay thế là:

while len(logging.root.handlers) > 0: 
    logging.root.removeHandler(logging.root.handlers[-1]) 
logging.basicConfig(format='%(asctime)s %(message)s',level=logging.DEBUG) 

hay:

logging.root.handlers = [] 
logging.basicConfig(format='%(asctime)s %(message)s',level=logging.DEBUG) 

nơi đầu tiên của hai sử dụng vòng lặp là an toàn nhất (vì bất kỳ mã hủy diệt cho xử lý có thể được gọi một cách rõ ràng bên trong khung đăng nhập) . Tuy nhiên, đây là một hack, vì chúng tôi dựa vào logging.root.handlers để trở thành một danh sách.

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