Python中,如何让多个py文件的logging输出到同一个日志log文件

本文介绍如何在Python项目中让多个.py文件共享同一份logging日志文件的方法。通过在主文件中设置logging的基本配置,并在子文件中直接使用logging函数,可以确保所有日志信息都统一记录在一个日志文件中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Python中,如何让多个py文件的logging输出到同一个日志log文件


转载:https://www.crifan.com/python_output_multiple_script_logging_into_single_log_file/

【问题】

有一个比较长的python脚本文件,其中关于log日志输出,用的是logging,对应初始化代码为:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
logging.basicConfig(
                 level    = logging.DEBUG,
                 format   = 'LINE %(lineno)-4d  %(levelname)-8s %(message)s' ,
                 datefmt  = '%m-%d %H:%M' ,
                 filename = scriptSelfName + ".log" ,
                 filemode = 'w' );
# define a Handler which writes INFO messages or higher to the sys.stderr
console = logging.StreamHandler();
console.setLevel(logging.INFO);
# set a format which is simpler for console use
formatter = logging.Formatter( 'LINE %(lineno)-4d : %(levelname)-8s %(message)s' );
# tell the handler to use this format
console.setFormatter(formatter);
logging.getLogger('').addHandler(console);

然后logging.info,logging.debug等就可以输入日志到对应的log文件BlogToWordpress.log中了。

现在该文件由于太大,被分为一个主文件BlogToWordpress.py和多个子文件,比如BlogNetease.py,crifanLib.py等。

由于被分拆之后,子文件中的log输出,好像无法直接使用logging了。

然后只能使用print,很是不爽。

现在希望,子文件中的logging和主文件中的logging的输出,都输出到同一个log文件,即主文件所生成的那个log文件中。

【解决过程】

1.由于之前刚搞懂关于py模块被当做子模块调用之前的初始化:

【已解决】Python中,模块被导入之前,如何初始化

所以首先想到的是,在子模块初始化中,也同样使用logging,然后单独生成自己的logging文件,测试代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
#------------------------------------------------------------------------------  
if __name__ = = "BlogNetease" :
     print "BlogNetease is imported from others" ;
 
     logging.basicConfig(
                     level    = logging.DEBUG,
                     filename = "BlogNetease.log" ,
                     filemode = 'w' ,
                     );
 
     logging.info( "logging output info from BlogNetease is OK ." );
     print "BlogNetease import end" ;

测试出来的结果很是诡异,好像是子文件再次配置的logging,把主文件的logging文件劫持了,然后接下来的输出,都输出到子文件的log文件中了。这不是我所希望的,每个py文件都有自己单独的log文件。

2.后来无意中发现,对于子文件,完全不需要多余额外设置,只需要:

import logging;

然后直接使用logging.info,logging.debug函数,即可实现把日志内容输出去,具体输出的形式,取决于主文件用logging.basicConfig所配置的形式。输入的位置,即主文件的log文件。

这样,至少可以很好地实现,将多个py文件的logging内容都输出到同一个主文件的log文件中,并且格式都是设置好的,统一的。

【总结】

主文件设置好logging.basicConfig相关参数,配置好StreamHandler等内容后,子文件,只需要导入logging模块,然后调用logging.info,logging.debug函数,即可实现将log信息,都输入到主文件的log中了
<think>好的,我需要回答用户关于Python logging模块的问题,具体是如何自定义log输出以及将log输出文件。首先,我应该回顾一下logging模块的基本用法和相关组件。 用户提到要自定义输出格式,这通常涉及到Formatter类。需要说明如何创建Formatter对象,并设置格式字符串,比如时间、日志级别、消息内容等。然后需要将这个formatter添加到handler上,比如StreamHandler或者FileHandler。 关于输出文件,用户可能想知道如何将日志同时输出到控制台和文件,或者只输出文件。需要介绍FileHandler的用法,以及如何设置不同的handler。同时,可能需要提到不同日志级别设置,比如DEBUG、INFO等,以及如何为不同的handler设置不同的级别。 另外,用户可能对日志的配置方式不太清楚,比如基本的basicConfig和更高级的logger配置。需要比较这两种方式,说明各自的适用场景。比如basicConfig适合快速上手,而使用logger和handler更灵活。 还要注意提到logger的层次结构,比如通过命名来获取logger实例,以及如何避免使用root logger,而是创建自己的logger。这可能涉及到getLogger()方法的使用。 可能还需要给出一个完整的示例代码,展示从导入模块,到创建logger,添加handler,设置formatter,以及记录不同级别的日志。这样用户可以直接参考代码进行实践。 另外,常见问题比如日志文件追加与覆盖的问题,需要说明FileHandler默认是追加模式,可以通过修改文件模式参数来改变。还有多个handler同时使用的情况,比如同时输出到控制台和文件。 需要确保回答结构清晰,分步骤说明,比如先讲基本使用,再讲自定义格式,然后讲输出文件,最后给出综合示例。同时,语言要简洁,避免术语过多,但又要准确。 最后,检查是否有遗漏的点,比如日志的旋转处理(RotatingFileHandler或TimedRotatingFileHandler),但用户的问题可能不需要涉及这些高级内容,除非用户提到。不过根据问题,可能只需要基础的文件输出,所以暂时不提也可以。 总结步骤: 1. 导入logging模块 2. 创建logger实例 3. 创建handler(如StreamHandler、FileHandler) 4. 创建formatter并设置格式 5. 将formatter添加到handler 6. 将handler添加到logger 7. 设置日志级别 8. 记录日志</think>让我们分步骤实现自定义日志输出和保存到文件: 一、基础配置(快速入门) ```python import logging # 基础配置(同时输出到控制台) logging.basicConfig( level=logging.DEBUG, # 设置最低记录级别 format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', filename='app.log', # 自动保存到文件 filemode='a' # 默认追加模式('w'为覆盖) ) logging.info('这是一条基础配置的日志') ``` 二、进阶自定义(推荐方式) ```python import logging # 1. 创建logger实例 logger = logging.getLogger('my_logger') logger.setLevel(logging.DEBUG) # 设置logger的最低级别 # 2. 创建控制台handler console_handler = logging.StreamHandler() console_handler.setLevel(logging.WARNING) # 控制台只显示WARNING及以上级别 # 3. 创建文件handler file_handler = logging.FileHandler('app.log', mode='a', encoding='utf-8') file_handler.setLevel(logging.DEBUG) # 文件记录所有DEBUG及以上级别 # 4. 创建格式化器 formatter = logging.Formatter( '[%(asctime)s] %(levelname)-8s %(name)-12s: %(message)s', datefmt='%Y-%m-%d %H:%M:%S' ) # 5. 应用格式化器 console_handler.setFormatter(formatter) file_handler.setFormatter(formatter) # 6. 添加handler到logger logger.addHandler(console_handler) logger.addHandler(file_handler) # 使用示例 logger.debug('调试信息') # 仅写入文件 logger.info('常规信息') # 仅写入文件 logger.warning('警告信息') # 同时显示在控制台和文件 logger.error('错误信息') # 同时显示在控制台和文件 ``` 三、关键组件说明表 | 组件 | 作用 | 常用配置项示例 | |---------------|-----------------------------------|----------------------------------------| | Logger | 日志记录入口点 | setLevel(), addHandler() | | Handler | 决定日志输出位置 | StreamHandler(), FileHandler() | | Formatter | 控制日志输出格式 | format='%(asctime)s - %(message)s' | | Filter | 更细粒度的日志过滤(可选) | 通过addFilter()添加自定义过滤逻辑 | 四、格式化符号速查表 | 占位符 | 说明 | 示例输出 | |-----------------|-----------------------------|-----------------------------------| | %(asctime)s | 记录时间 | 2023-08-01 14:30:00 | | %(levelname)s | 日志级别全称 | DEBUG, INFO, WARNING | | %(levelno)s | 日志级别数字 | 10, 20, 30 | | %(name)s | logger名称 | my_logger | | %(message)s | 日志消息内容 | 用户登录失败 | | %(filename)s | 执行日志调用的文件名 | app.py | | %(lineno)d | 调用行号 | 42 | | %(funcName)s | 调用函数名 | main | 五、最佳实践建议 1. **层级结构**:通过命名建立logger层级(如`getLogger('app.module')`) 2. **级别控制**: - DEBUG:开发调试细节 - INFO:常规运行状态 - WARNING:预期外但可处理的问题 - ERROR:严重错误(部分功能失效) - CRITICAL:系统级错误 3. **性能优化**:在输出前进行级别判断 ```python if logger.isEnabledFor(logging.DEBUG): logger.debug(f'耗时的调试信息: {complex_calculation()}') ``` 六、扩展应用示例(同时输出到控制台和文件) ```python # 创建JSON格式handler(适合日志分析) import json_logging json_handler = logging.FileHandler('app.json') json_formatter = json_logging.JSONFormatter() json_handler.setFormatter(json_formatter) logger.addHandler(json_handler) ``` 通过以上配置,您可以: - 在控制台看到简洁的警告信息 - 在app.log中记录详细运行日志 - 在app.json中生成结构化日志(需安装json-logging库)
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值