2013-03-04 167 views
11

這是我的場景:我想記錄my_module的活動。這需要完成,取決於執行的方法(比方說,INPUT和OUTPUT),這取決於兩個不同的文件。Python使用同一個記錄器記錄多個文件

所以我有兩個處理程序,每個處理程序指向一個不同的文件(my_in_.log & my_out_.log),具有相同的日誌級別。我想知道如果我可以使用相同的記錄器來實現這一點,或者我必須定義兩個記錄器。我配置是:

[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) 

我必須確定每個處理器/目的地的記錄? (因爲我想在不同的文件中記錄不同的信息) 有沒有辦法告訴記錄器哪個處理程序會這樣做?我的意思是,我有一個記錄器的兩個處理程序,然後選擇一個處理程序來記錄一個方法。

Thx很多!

回答

3

最後我決定定義兩個記錄器,這是因爲:

  • 它們是不同的purposses。在我的情況下,一個將輸入請求記錄到Web服務,另一個記錄響應。他們使用不同的文件

  • 我正在使用一個日誌配置文件,在一個正面的Web服務。 @mike說,在記錄消息之前添加/刪除處理程序並不是正確的方法。 Thx to @drekyn呢!

這是我的日誌配置文件,僅供參考,如果有人有興趣:

[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= 

見你!

7

您應該爲每個要發送日誌的目標實例化一個Handler,然後將2個處理程序添加到您的記錄器。 以下應工作(沒有雖然測試):

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

當然,添加你需要的所有配置和格式化選項。基本上只是告訴你,當你實例化日誌處理程序時,你可以將它添加到日誌記錄器中。從那一刻起,您的日誌記錄將被髮送到添加到記錄器的每個處理程序。

+0

也許我不明白:我不希望我的日誌記錄,以每** **處理程序添加到記錄器。我想要的是選擇哪個處理程序將記錄該記錄,即一個記錄程序 - >兩個處理程序,但選擇記錄將分配到哪個目標。重複使用不同處理程序的同一個記錄程序,但某些記錄將由一個處理程序記錄,還有一些與另一個...這是可能的,或者我必須定義其他記錄器?多謝! :) – 2013-03-04 11:30:33

+1

@AlbertoMegía您應該定義您自己的方法,將日誌目標作爲參數,並在內部使用正確的處理程序來處理日誌消息。 – mike 2013-03-04 11:34:57

+0

所以@mike你的意思是我必須添加和刪除記錄器的處理程序來選擇它在運行時?這可能不是我最好的選擇,因爲這個模塊是我在Web服務中的正面視圖...每次請求我都必須切換處理程序...:S – 2013-03-04 11:41:22

3

你想要的是

  1. 創建2個非ROOT記錄器。
  2. 化妝處理的每一個,指向不同的文件
  3. 添加處理程序,以適當的記錄

    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) 
    

然後

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

請注意,如果您創建一個根記錄和一個不同的記錄器,根記錄器將記錄這個不同的控制器試圖記錄的所有內容。

換句話說,如果

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) 

然後

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