Python使用同一logger记录多个文件
这是我的情况:我想记录我的模块的活动。这需要根据执行的方法(比如说,输入和输出)分别记录到两个不同的文件中。
所以我有两个处理器,每个处理器指向一个不同的文件(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)
我是否需要为每个处理器/目标定义一个记录器(因为我想在不同的文件中记录不同的信息)?有没有办法告诉记录器哪个处理器会执行这个操作?我的意思是,我有两个处理器对应一个记录器,然后只选择一个处理器来记录一个方法。
3 个回答
9
你需要为每个你想发送日志的地方创建一个处理器,然后把这两个处理器添加到你的日志记录器里。下面的代码应该可以工作(不过我没测试过):
logger = logging.getLogger()
handler1 = logging.TimedRotatingFileHandler()
handler2 = logging.TimedRotatingFileHandler()
logger.addHandler(handler1)
logger.addHandler(handler2)
当然,你还可以添加所有你需要的配置和格式选项。基本上,这只是为了告诉你,当你创建日志处理器时,可以把它添加到日志记录器里。从那时起,你的日志记录就会发送到所有添加到日志记录器里的处理器。
10
你想要做的是:
- 创建两个非根日志记录器。
- 为每个日志记录器创建一个处理器,并指向不同的文件。
将处理器添加到相应的日志记录器中。
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 ")
6
最后我决定定义两个日志记录器,因为:
它们的用途不同。在我的情况下,一个记录对网络服务的输入请求,另一个记录响应。而且它们使用不同的文件来保存这些信息。
我在一个前端网络服务中使用了一个日志配置文件。像@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=
再见!