2010-08-12 30 views
8

Tôi có một logger như khởi tạo chức năng:python logger khai thác gỗ cùng nhập nhiều lần

def generate_logger(): 
    import logging 
    LOG_FILENAME = os.path.join(PROJECT_DIR, "mylog.log") 
    FORMAT = "%(asctime)s : %(message)s" 
    logger = logging.getLogger() 
    logger.setLevel(logging.INFO) 
    fh = logging.FileHandler(LOG_FILENAME) 
    formatter = logging.Formatter(FORMAT) 
    fh.setFormatter(formatter) 
    logger.addHandler(fh) 
    return logger 

Và ở một số phần của mã của tôi Tôi có ngoại lệ như vậy bắt:

logger = generate_logger() 
except AttributeError: 
    logger.error('Opps we got an error') 

thật là thú vị tôi nhận được cùng một lỗi được viết 2 lần và nó có thể là caugh chỉ một lần, một khi tôi thay đổi logger.error('Opps we got an error') với print "test", tôi nhận được "kiểm tra" in một lần.

Điều gì có thể là vấn đề và giải pháp.

Kính trọng

Trả lời

9

Bạn đang thêm một FileHandler mới vào trình ghi nhật ký mỗi khi bạn gọi hàm đó: cuộc gọi tới logger.getLogger không có đối số tên trả về cùng một đối tượng nhật ký mỗi lần.

Bạn nên gọi generate_logger() chỉ một lần và sau đó chỉ cần lấy đối tượng logger cùng bằng cách gọi logger.getLogger():

generate_logger() 

# .... some time later 

log = logger.getLogger() 
except AttributeError: 
    log.error('Opps we got an error') 

(lưu ý rằng bạn không cần generate_logger() để trả về giá trị hiện nay)

2

Có thể bạn có hai trình xử lý sẽ cùng một bản ghi kết quả.

Bạn tạo bao nhiêu trình xử lý? Bạn đang thực hiện generate_logger bao nhiêu lần? Mỗi lần bạn thực hiện generate_logger bạn sẽ tạo một trình xử lý khác cho cùng một tệp, dẫn đến sao chép tiềm năng.

3

Tôi nghĩ rằng bạn có thể nhận được hai trình xử lý được thêm vào trình ghi nhật ký bằng cách nào đó. Có lẽ tại một số điểm, một trình xử lý ngầm đang được thêm vào.

9

Tôi cũng gặp phải sự cố tương tự và gặp phải trang này. Vâng, tôi cũng đã tạo nhiều trình xử lý. Trong generate_logger(), bạn có thể kiểm tra xem có bất kỳ trình xử lý nào khác và xóa chúng hay không.

def generate_logger(): 
    import logging 
    LOG_FILENAME = os.path.join(PROJECT_DIR, "mylog.log") 
    FORMAT = "%(asctime)s : %(message)s" 
    logger = logging.getLogger() 
    logger.setLevel(logging.INFO) 
    # Reset the logger.handlers if it already exists. 
    if logger.handlers: 
     logger.handlers = [] 
    fh = logging.FileHandler(LOG_FILENAME) 
    formatter = logging.Formatter(FORMAT) 
    fh.setFormatter(formatter) 
    logger.addHandler(fh) 
    return logger 
Các vấn đề liên quan