Xác định xem trình ghi gốc có được đặt ở mức GỠ LỖI trong Python hay không?


92

Nếu tôi đặt mô-đun ghi nhật ký thành GỠ LỖI với tham số dòng lệnh như sau:

if (opt["log"] == "debug"):
  logging.basicConfig(level=logging.DEBUG)

Sau này làm cách nào để biết liệu trình ghi nhật ký đã được đặt thành GỬI KHÔNG? Tôi đang viết một trình trang trí sẽ tính thời gian cho một hàm nếu cờ True được chuyển cho nó và nếu không có cờ nào được đưa ra, nó sẽ mặc định in thông tin thời gian khi trình ghi gốc được đặt thành GỬI.


Cuối cùng bạn sẽ muốn sử dụng một cái gì đó cụ thể thay vì kết hợp cái này với trình ghi nhật ký, chẳng hạn như opt ["time_functions"] (mà bạn có thể mặc định là True / False dựa trên một số tùy chọn khác).

Câu trả lời:


114
logging.getLogger().getEffectiveLevel()

logging.getLogger() không có đối số sẽ nhận được trình ghi cấp độ gốc.

http://docs.python.org/library/logging.html#logging.Logger.getEffectiveLevel


Cảm ơn vô cùng! Tôi đang làm một cái gì đó như thế (trừ đi rõ ràng "gốc" để getLogger), nhưng tôi đã làm việc đó trong init chức năng trang trí của tôi, trước khi logger được thiết lập để debug: \
gct

5
Nếu bạn muốn tên của mức độ, không phải là số, bạn có thể sử dụng để chuyển đổi số thành một chuỗi (như 'INFO'): logging.getLevelName ()
guettli

2
@guettli, getLevelName () yêu cầu một đối số chứa cấp có biểu diễn dạng văn bản mà bạn muốn lấy. Vì vậy, các cuộc gọi thực sự là con thú này: logging.getLevelName(logging.getLogger().getEffectiveLevel()). Sẽ rất tuyệt nếu có một cú pháp đơn giản hơn khi tất cả những gì bạn muốn là chuỗi cho cấp độ hiện tại.
Trutane

Để chuyển đổi số nguyên mức tên: docs.python.org/3/library/logging.html#levels
EddyTheB

103

Trên thực tế, có một cách tốt hơn: sử dụng mãlogging.getLogger().isEnabledFor(logging.DEBUG) . Tôi đã tìm thấy nó trong khi cố gắng hiểu phải làm gì với kết quả của getEffectiveLevel().

Dưới đây là mã mà chính mô-đun ghi nhật ký sử dụng.

def getEffectiveLevel(self):
    """
    Get the effective level for this logger.

    Loop through this logger and its parents in the blogger hierarchy,
    looking for a non-zero logging level. Return the first one found. 
    """
    logger = self
    while logger:
        if logger.level:
            return logger.level
        logger = logger.parent
    return NOTSET

def isEnabledFor(self, level):
    """
    Is this logger enabled for level ‘level’?
    """
    if self.manager.disable >= level:
        return 0
    return level >= self.getEffectiveLevel()

4
Đây phải là câu trả lời được chấp nhận, vì nó làm điều tương tự với độ phức tạp thời gian chạy thấp hơn.
AndyJost

1
Nếu nó là mã thực tế và không phải là hình ảnh. Vẫn: ủng hộ.
kaiser

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.