Alb*_*gía 13 python logging config
这是我的场景:我想记录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)
Run Code Online (Sandbox Code Playgroud)
我是否必须为每个处理程序/目标定义一个记录器?(因为我想在不同的文件中记录不同的信息)有没有办法向记录器指示哪个处理程序会这样做?我的意思是,我有一个记录器的两个处理程序,然后只选择一个处理程序来记录一个方法.
多谢!
您应该为要将日志发送到的每个目标实例化一个Handler,然后将2个处理程序添加到记录器中.以下应该工作(虽然没有测试):
logger = logging.getLogger()
handler1 = logging.TimedRotatingFileHandler()
handler2 = logging.TimedRotatingFileHandler()
logger.addHandler(handler1)
logger.addHandler(handler2)
Run Code Online (Sandbox Code Playgroud)
当然,添加您可能需要的所有配置和格式选项.基本上,它只是向您展示,当您实例化日志记录处理程序时,您可以将其添加到记录器.从那一刻起,您的日志记录将被发送到添加到记录器的每个处理程序.
最后我决定定义两个记录器,因为:
它们用于不同的目的。就我而言,一个记录对 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=
Run Code Online (Sandbox Code Playgroud)
再见!
你想要的是
将处理程序添加到适当的记录器
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)
Run Code Online (Sandbox Code Playgroud)然后
logger1.info("this will be logged to file_1 ")
logger2.info("this will be logged to file_2 ")
Run Code Online (Sandbox Code Playgroud)
请注意,如果您创建ROOT记录器和其他记录器,则root记录器将记录该其他控制器尝试记录的所有内容。
换句话说,如果
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)
Run Code Online (Sandbox Code Playgroud)
然后
root_logger.info("this will be logged to file_1 ")
logger2.info("this will be logged to file_1 AND file_2 ")
Run Code Online (Sandbox Code Playgroud)