Python日志配置问题:自定义日志文件名与来源标识
解决方案
1. 重构公共日志模块 logger.py
不再提前初始化全局日志实例,而是提供一个动态初始化函数,让主脚本指定日志文件名;同时日志格式中加入模块名字段,用来区分日志来源。
import logging from logging.handlers import RotatingFileHandler def setup_logger(log_filename): # 配置日志格式,%(name)s会自动填充当前logger的名称(即模块标识) log_format = "%(asctime)s - %(name)s - %(levelname)s - %(message)s" formatter = logging.Formatter(log_format) # 获取根logger并配置级别 root_logger = logging.getLogger() root_logger.setLevel(logging.INFO) # 移除默认控制台handler,避免重复输出 for handler in root_logger.handlers[:]: root_logger.removeHandler(handler) # 添加文件handler,使用主脚本指定的文件名 file_handler = RotatingFileHandler(log_filename, maxBytes=10*1024*1024, backupCount=5) file_handler.setFormatter(formatter) root_logger.addHandler(file_handler) # 可选:添加控制台输出handler console_handler = logging.StreamHandler() console_handler.setFormatter(formatter) root_logger.addHandler(console_handler)
2. 修改主脚本 data.py
在脚本开头调用logger.setup_logger传入自定义日志文件名,然后为当前模块创建专属logger,手动指定标识为DATA(也可以用__name__,默认是__main__)。
import logging import logger import login # 主脚本指定日志文件名 logger.setup_logger("data_script.log") # 获取当前模块的logger,指定来源标识为DATA data_logger = logging.getLogger("DATA") def main(): data_logger.info("主脚本data.py开始执行") login.do_login() data_logger.info("主脚本data.py执行完毕") if __name__ == "__main__": main()
3. 修改公共模块 login.py
直接为当前模块创建专属logger,指定来源标识为LOGIN,日志会自动带上该标识。
import logging # 获取当前模块的logger,指定来源标识为LOGIN login_logger = logging.getLogger("LOGIN") def do_login(): login_logger.info("开始执行登录操作") # 登录逻辑代码... login_logger.info("登录操作执行完成")
关键说明
- 每个模块通过
logging.getLogger("自定义标识")创建专属logger,日志格式中的%(name)s会自动替换为这个标识,实现来源区分。 logger.py的setup_logger函数只需在主脚本中调用一次,所有模块的日志都会统一使用该配置(包括文件名、格式)。- 其他主脚本(如
report.py)只需在开头调用logger.setup_logger("report_script.log"),即可生成独立日志文件,同时各模块日志来源保持正确。
内容的提问来源于stack exchange,提问作者acr
相关产品推荐
相关产品推荐

