2013-06-20 37 views
5

Tôi đã tìm thấy this câu trả lời cho một vấn đề có vẻ tương tự, tuy nhiên (vì tôi mới làm quen với Python) Tôi không chắc chắn cách triển khai giải pháp này trong mã của tôi (nếu đó là vấn đề tương tự sau tất cả các).Ghi nhật ký tin nhắn xuất hiện hai lần trong giao diện điều khiển Python

Trong mã của tôi, tôi có phần sau:

logging.basicConfig(level=logging.DEBUG, 
        format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s', 
        filename='C:\\Tests\\TRACE.log', 
        filemode='a') 
console = logging.StreamHandler() 
console.setLevel(logging.INFO) 
consoleFormatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s') 
console.setFormatter(consoleFormatter) 
logging.getLogger('').addHandler(console) 
localLog = logging.getLogger('text') 

Điều buồn cười là nó được sử dụng để làm việc tốt nhưng tại một số thời điểm nó bắt đầu viết những thông điệp trùng lặp để an ủi.

Ai đó có thể cho tôi hướng dẫn tại đây không?

Trả lời

5

Dường như tôi đã tìm ra nguồn gốc của vấn đề này.

Điều này là tôi đã sử dụng để nhận logger ở cấp mô-đun. Nó trông khá hợp lý nhưng có một cạm bẫy - mô-đun đăng nhập Python tôn trọng tất cả các logger được tạo trước khi bạn tải cấu hình từ một tệp. Vì vậy, về cơ bản, khi tôi đã nhập một mô-đun (sử dụng được logger nội bộ) vào một mã chính (nơi mà tôi đã gọi cho một logger là tốt) nó dẫn đến streaming dữ liệu logger hai lần.

Các giải pháp khả thi cho vấn đề này là:

  1. Đừng logger ở cấp mô-đun
  2. Đặt disable_existing_loggers để False. Thêm từ Python 2,7
5

Thông thường các báo cáo nhật ký trùng lặp xảy ra do có hai trình xử lý riêng được đính kèm đang hướng dẫn các bản ghi nhật ký của bạn đến cùng một vị trí. Có một vài điều đáng để cố gắng truy cập vào thư mục gốc của sự cố:

  1. Nhận xét cuộc gọi để đăng nhập .basicConfig - nếu điều này loại bỏ các báo cáo đăng nhập trùng lặp thì điều này có nghĩa là bạn không cần phải tự cấu hình trình xử lý nhật ký thứ hai.
  2. Nếu bạn đang sử dụng IDE, bạn có thể đặt điểm ngắt trên bảng sao kê, và sử dụng trình gỡ lỗi để bạn có thể quan sát trạng thái thiết lập nhật ký pythons để có hình ảnh rõ ràng hơn về các trình xử lý khác nhau được đính kèm.

Để đăng nhập dễ quản lý hơn, có thể tìm cách di chuyển cấu hình ra khỏi mã và vào tệp cấu hình - tài liệu Python trên logging configuration là một nơi tuyệt vời để bắt đầu.

+1

Hi và cảm ơn cho câu trả lời của bạn nhưng làm thế nào tôi có thể nhận xét ra tất cả các ' loggingBasicConfig'? Nó bao gồm các thiết lập bắt buộc như đường dẫn, định dạng và filemode ... –

+1

Từ đọc câu hỏi, có vẻ như vấn đề là bạn đang nhận các thông điệp tường trình trùng lặp trong bảng điều khiển và việc ghi nhật ký tệp không phải là vấn đề. Nghi ngờ của tôi là basicConfig đang thiết lập một trình xử lý nhật ký console, và sau đó bạn đang thiết lập một trình xử lý nhật ký bàn điều khiển thứ hai. Chúng tôi khuyên bạn nên di chuyển cấu hình ghi nhật ký sang tệp cấu hình nơi bạn có thể rõ ràng hơn về thiết lập cụ thể. – robjohncox

+1

Một điều đáng chú ý là đăng nhập vào tập tin, bàn điều khiển hoặc bất kỳ đích nào khác không bắt buộc - việc ghi nhật ký chỉ đơn giản là một cách hướng thư đến một nơi hữu ích để xem hoặc lưu trữ chúng, và có nhiều nơi khác nhau bạn có thể muốn gửi cho họ (tệp và bảng điều khiển là hai tùy chọn rất phổ biến). Có thể khuyên bạn nên làm việc thông qua [hướng dẫn ghi nhật ký nâng cao] (http://docs.python.org/2/howto/logging.html#advanced-logging-tutorial) trong tài liệu python để có được một giới thiệu vững chắc về cách hoạt động của ghi nhật ký. – robjohncox

0

tôi đã có tình trạng tương tự với cấu hình logger của tôi, việc sửa chữa mà tôi sử dụng là:

class Logger: 

@staticmethod 
def setup(name, file_name): 

    log_file = <path to save the file> 
    log_file_max_size = 1024 * 1024 * 20 # megabytes 
    log_num_backups = 3 
    log_format = "%(asctime)s [%(levelname)s]: %(filename)s(%(funcName)s:%(lineno)s) >> %(message)s" 
    log_filemode = "w" # w: overwrite; a: append 
    logging.basicConfig(filename=log_file, format=log_format, filemode=log_filemode, level=logging.DEBUG) 
    rotate_file = logging.handlers.RotatingFileHandler(
     log_file, maxBytes=log_file_max_size, backupCount=log_num_backups 
    ) 
    logger = logging.getLogger(name) 
    # Console output line. 
    console_handler = logging.StreamHandler() 
    console_handler.setLevel(logging.INFO) 
    log_formatter = logging.Formatter(log_format) 
    console_handler.setFormatter(log_formatter) 
    logger.handlers = rotate_file, console_handler 

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