我能从主模块为记录器提供文件名吗?
我正在使用以下方式,但它不起作用。所有日志都转到 xyz.log 文件而不是 main.log
根据nosklo的建议更新
logger.py
formatter = logging.Formatter(fmt='[%(asctime)s] - {%(filename)s:%(lineno)d} %(levelname)s - %(message)s')
def _get_file_handler(file_name="xyz.log"):
file_handler = logging.FileHandler(file_name)
file_handler.setLevel(logging.DEBUG)
file_handler.setFormatter(formatter)
return file_handler
def get_logger(name):
logger = logging.getLogger(name)
logger.setLevel(logging.DEBUG)
logger.addHandler(_get_file_handler())
return logger
parser.py
log = logger.get_logger(__name__)
def parse():
log.info("is there anyway this could go to main.log and xyz.log")
main.py
log = logger.get_logger(__name__)
if __name__ == '__main__':
for handler in log.handlers:
if isinstance(handler, logging.FileHandler):
log.removeHandler(handler)
log.addHandler(logger._get_file_handler())
log.info("is there anyway this could go to main.log and xyz.log?")
parser.parse()
我可以通过main.py
模块设置日志文件名而不是logger.py
模块吗?
答案 0 :(得分:1)
您首先调用get_logger()
,因此当您在FileName.file_name = "main.log"
中设置class属性时,get_logger
函数已经完成,并且已经定义了记录器以写入{{1} }};稍后更改变量将不再更改记录器,因为它已经定义。
要更改以前选择的文件,您必须检索记录器,删除以前的处理程序并添加新的文件处理程序。另一个选项是在调用xyz.log
之前设置变量,因此当您调用它时,变量已经具有正确的值。
答案 1 :(得分:0)
日志记录实例可以有多个文件处理程序。使用这样的函数只添加另一个处理程序以及您想要的其他输出路径。日志消息将发送到添加到实例的两个(或所有)文本日志。您甚至可以将处理程序配置为具有不同的日志记录级别,以便您可以将消息过滤到不同的日志中以查找严重错误,信息消息等。
import logging
def add_handler(output_log_path, log):
# Set up text logger and add it to logging instance
file_logger = logging.FileHandler(output_log_path)
file_logger.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s | logger name: %(name)s | module: %(module)s | lineno: %(lineno)d | %(message)s')
file_logger.setFormatter(formatter)
log.addHandler(file_logger)
return log