Python使用同一个日志记录多个文件

2024-04-29 08:07:25 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我的场景:我想记录我的_模块的活动。这需要对两个不同的文件执行,具体取决于执行的方法(例如,输入和输出)。

所以我有两个处理程序,每一个都指向一个不同的文件(my_uin_u.log&my_uout_u.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)

我是否必须为每个处理程序/目标定义一个记录器(因为我想在不同的文件中记录不同的信息)?是否有方法向记录器指示哪个处理程序将执行此操作?我是说,我有两个处理程序用于一个记录器,然后只选择一个处理程序来记录一个方法。


Tags: 文件方法informlog处理程序myhandlers
3条回答

最后我决定定义两个伐木工人,因为:

  • 它们有不同的用途。在我的例子中,一个记录对web服务的输入请求,另一个记录响应。他们使用不同的文件

  • 我正在使用一个日志配置文件,在一个前端web服务中。正如@mike所说,在记录消息之前添加/删除处理程序不是正确的方法。我也要打给德雷金!

这是我的日志配置文件,仅供有兴趣的人参考:

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

再见!

你想要的是

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

您应该为要将日志发送到的每个目标实例化一个处理程序,然后将2个处理程序添加到日志记录器中。 以下方法应该有效(但没有进行测试):

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

当然,添加您可能需要的所有配置和格式选项。基本上,这只是为了向您展示,当您实例化日志处理程序时,您可以将其添加到日志记录器中。从那时起,您的日志记录将被发送到添加到记录器的每个处理程序。

相关问题 更多 >