簡體   English   中英

Python使用同一個記錄器記錄多個文件

[英]Python logging multiple files using the same logger

這是我的場景:我想記錄 my_module 的活動。 這需要根據執行的方法(比方說,INPUT 和 OUTPUT)對兩個不同的文件進行。

所以我有兩個處理程序,每個指向一個不同的文件(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)

我是否必須為每個處理程序/目的地定義一個記錄器(因為我想在不同的文件中記錄不同的信息)? 有沒有辦法向記錄器指示哪個處理程序將執行此操作? 我的意思是,我有一個記錄器的兩個處理程序,然后只選擇一個處理程序來記錄一種方法。

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

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

當然,添加您可能需要的所有配置和格式選項。 基本上它只是為了向您展示,當您實例化日志處理程序時,您可以將其添加到記錄器中。 從那一刻起,您的日志記錄將發送到添加到記錄器的每個處理程序。

你想要的是

  1. 創建 2 個非根記錄器。
  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 和一個不同的 logger,root logger 將記錄這個不同的控制器試圖記錄的所有內容。

換句話說,如果

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

最后我決定定義兩個記錄器,因為:

  • 它們用於不同的目的。 就我而言,一個記錄對 Web 服務的輸入請求,另一個記錄響應。 他們使用不同的文件

  • 我在前端 Web 服務中使用日志配置文件。 正如@mike 所說,在記錄消息之前添加/刪除處理程序不是正確的方法。 也感謝@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=

再見!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM