2013-03-04 44 views
11

Đây là kịch bản của tôi: Tôi muốn đăng nhập hoạt động của my_module. Điều này cần được thực hiện, tùy thuộc vào phương thức được thực thi (giả sử, INPUT và OUTPUT), với hai tệp khác nhau.Ghi nhật ký Python nhiều tệp bằng cùng một trình ghi

Vì vậy, tôi có hai Trình xử lý, mỗi điểm trỏ đến một tệp khác (my_in_.log & my_out_.log), với cùng cấp nhật ký. Tôi muốn biết nếu tôi có thể sử dụng cùng một logger để đạt được điều này hoặc tôi phải xác định hai logger. My cấu hình là:

[loggers] 
keys=root, my_log 

[handlers] 
keys=my_in_hand, my_out_hand 

[formatters] 
keys=generic_form 


... 


[logger_my_log] 
level=NOTSET 
handlers=my_in_hand, my_out_hand 
qualname=ws_log 

[handler_my_in_hand] 
class=handlers.TimeRotatingFileHandler 
level=NOTSET 
formatter=generic_form 
args=('my_in_.log', 'h', 1, 0, None, False, True) 

[handler_my_out_hand] 
class=handlers.TimeRotatingFileHandler 
level=NOTSET 
formatter=generic_form 
args=('my_out_.log', 'h', 1, 0, None, False, True) 

Tôi có phải xác định một logger mỗi handler/đích? (vì tôi muốn đăng nhập thông tin khác nhau trong các tệp khác nhau) Có cách nào để chỉ ra trình ghi nhật ký mà trình xử lý sẽ thực hiện việc này không? Tôi có nghĩa là, tôi có hai xử lý cho một logger, sau đó chọn chỉ có một xử lý để đăng nhập một phương pháp.

Thx rất nhiều!

Trả lời

3

Cuối cùng tôi quyết định để xác định hai logger, bởi vì:

  • Họ cho purposses khác nhau. Trong trường hợp của tôi, một bản ghi yêu cầu đầu vào cho một dịch vụ web và một bản ghi khác sẽ ghi lại phản hồi. Và họ sử dụng các tệp khác nhau cho nó

  • Tôi đang sử dụng tệp cấu hình ghi nhật ký, trong dịch vụ web trực tuyến. Việc thêm/xóa trình xử lý trước khi ghi nhật ký không phải là cách tiếp cận đúng, như @mike đã nói. Thx để @drekyn quá!

Đây là tập tin cấu hình đăng nhập của tôi, chỉ để tham khảo nếu có ai quan tâm đến việc:

[loggers] 
keys=root, ws_in_log, ws_out_log 

[handlers] 
keys=consoleHandler, ws_in_hand, ws_out_hand 

[formatters] 
keys=generic_form 

[logger_root] 
handlers=consoleHandler 
level=NOTSET 

[logger_ws_in_log] 
level=NOTSET 
handlers=ws_in_hand 
qualname=ws_in_log 

[logger_ws_out_log] 
level=NOTSET 
handlers=ws_out_hand 
qualname=ws_out_log 

[handler_ws_in_hand] 
class=logging.handlers.TimedRotatingFileHandler 
level=NOTSET 
formatter=generic_form 
args=('/path/ws_in_.log', 'h', 1, 0, None, False, True) 

[handler_ws_out_hand] 
class=logging.handlers.TimedRotatingFileHandler 
level=NOTSET 
formatter=generic_form 
args=('/path/em/ws_out_.log', 'h', 1, 0, None, False, True) 

[handler_consoleHandler] 
class=StreamHandler 
level=DEBUG 
formatter=generic_form 
args=(sys.stdout,) 

[formatter_generic_form] 
format='%(asctime)s - %(levelname)s - %(message)s' 
datefmt='%Y-%m-%d %H:%M:%S' 
class= 

Hẹn gặp lại!

7

Bạn nên khởi tạo Trình xử lý cho mỗi đích bạn muốn gửi nhật ký, sau đó thêm 2 trình xử lý vào nhật ký của bạn. Các nội dung sau đây sẽ hoạt động (không thử nghiệm):

logger = logging.getLogger() 
handler1 = logging.TimedRotatingFileHandler() 
handler2 = logging.TimedRotatingFileHandler() 
logger.addHandler(handler1) 
logger.addHandler(handler2) 

Tất nhiên sẽ thêm tất cả các tùy chọn cấu hình và định dạng bạn cần. Về cơ bản nó chỉ là để cho bạn thấy rằng khi bạn nhanh chóng xử lý đăng nhập, bạn có thể thêm nó vào bộ ghi. Từ thời điểm đó, các bản ghi nhật ký của bạn sẽ được phát ra cho mọi trình xử lý được thêm vào trình ghi nhật ký.

+0

Có lẽ tôi không phải là rõ ràng: Tôi không muốn đăng nhập hồ sơ của tôi để ** mỗi handler ** thêm vào logger. Những gì tôi muốn là chọn trình xử lý nào sẽ ghi nhật ký, đó là, một trình ghi -> hai trình xử lý nhưng chọn đích nào sẽ được phân bổ. Bản ghi lại cùng một bộ ghi với các trình xử lý khác nhau, nhưng một số bản ghi sẽ được ghi bởi một trình xử lý , và một số với nhau ... Điều này có thể hoặc tôi phải xác định logger khác? CẢM ƠN NHIỀU! :) –

+1

@ AlbertoMegía Bạn nên xác định phương thức của riêng bạn làm đối số đích đến của nhật ký và sử dụng bộ xử lý bên phải cho thông điệp tường trình. – mike

+0

Vì vậy, bạn có nghĩa là tôi phải thêm và loại bỏ trình xử lý của trình ghi nhật ký để chọn nó trong thời gian chạy? Đây có thể không phải là lựa chọn tốt nhất của tôi bởi vì mô-đun này là chế độ xem trước của tôi trong dịch vụ web ... với mọi yêu cầu tôi sẽ phải chuyển bộ xử lý ...: S –

3

những gì bạn muốn là

  1. tạo 2 logger ROOT KHÔNG.
  2. làm handler cho mỗi người, trỏ đến tập tin khác nhau
  3. add xử lý để logger thích hợp

    logger1 = logging.getLogger('general_logger') 
    logger2 = logging.getLogger('some_other_logger') 
    
    log_handler1 = logging.handlers.RotatingFileHandler(file_1, *args) 
    log_handler2 = logging.handlers.RotatingFileHandler(file_2, *args) 
    
    logger1.addHandler(log_handler1) 
    logger2.addHandler(log_handler2) 
    

sau đó

logger1.info("this will be logged to file_1 ") 
    logger2.info("this will be logged to file_2 ") 

Xin lưu ý rằng nếu bạn tạo một logger ROOT và một trình ghi nhật ký khác, trình ghi nhật ký gốc sẽ ghi lại mọi thứ mà bộ điều khiển khác này đang cố đăng nhập.

Nói cách khác, nếu

root_logger = logging.getLogger() 
    logger2 = logging.getLogger('some_other_logger') 

    root_log_handler = logging.handlers.RotatingFileHandler(file_1, *args) 
    log_handler2 = logging.handlers.RotatingFileHandler(file_2, *args) 

    root_logger.addHandler(root_log_handler) 
    logger2.addHandler(log_handler2) 

sau đó

root_logger.info("this will be logged to file_1 ") 
    logger2.info("this will be logged to file_1 AND file_2 ") 
Các vấn đề liên quan