logging 日志同时输出到控制台(踩坑:python2 vs python3使用差异)

本文探讨了在Python2和Python3中使用logging模块时遇到的问题。在Python3环境下,日志能正常输出到文件和控制台,但在Python2环境下,仅输出到控制台。通过查阅官方文档并尝试设置`force=True`参数,发现该方法在Python2下无效。最终,通过直接修改logging.root配置,实现了在Python2和Python3中同时输出日志到文件和控制台的效果。

一段python3 生效的代码:

import logging

for handler in logging.root.handlers[:]:
	logging.root.removeHandler(handler)
logging.basicConfig(
	level=logging.DEBUG,
	format="%(a
<think> 我们正在处理用户关于Python logging模块的问题。用户希望了解如何同时日志输出到文件和控制台。 根据引用[1]和引用[2],我们知道可以使用logging模块来实现这个功能。具体来说,我们需要配置logger,添加两个handler:一个用于控制台(StreamHandler),一个用于文件(FileHandler)。 步骤: 1. 导入logging模块。 2. 创建一个logger对象。 3. 设置logger的日志级别(例如DEBUG)。 4. 创建控制台处理器(StreamHandler),设置其日志级别和格式。 5. 创建文件处理器(FileHandler),设置其日志级别和格式。 6. 将两个处理器添加到logger中。 7. 使用logger记录日志。 注意:格式化字符串可以使用引用[2]中提供的各种属性,例如%(asctime)s、%(levelname)s等。 下面我们将给出具体的代码实现,并解释每一步。 </think>### 使用 Python logging 模块实现日志输出到文件和控制台 以下是完整的实现方法,通过配置 logging 模块同时输出日志控制台和文件: ```python import logging import sys def setup_logging(log_file=&#39;app.log&#39;): # 创建 Logger 对象 logger = logging.getLogger(__name__) logger.setLevel(logging.DEBUG) # 设置最低日志级别 # 创建格式化器 formatter = logging.Formatter( &#39;%(asctime)s - %(name)s - %(levelname)s - %(message)s&#39;, datefmt=&#39;%Y-%m-%d %H:%M:%S&#39; ) # 创建文件处理器 (输出到文件) file_handler = logging.FileHandler(log_file) file_handler.setLevel(logging.DEBUG) # 文件记录所有级别日志 file_handler.setFormatter(formatter) # 创建控制台处理器 (输出到屏幕) console_handler = logging.StreamHandler(sys.stdout) console_handler.setLevel(logging.INFO) # 控制台仅显示INFO及以上级别 console_handler.setFormatter(formatter) # 添加处理器到Logger logger.addHandler(file_handler) logger.addHandler(console_handler) return logger # 初始化日志记录器 logger = setup_logging(&#39;application.log&#39;) # 使用示例 logger.debug(&#39;调试信息 - 仅写入文件&#39;) logger.info(&#39;普通信息 - 输出控制台和文件&#39;) logger.warning(&#39;警告信息&#39;) logger.error(&#39;错误信息&#39;) logger.critical(&#39;严重错误信息&#39;) ``` ### 关键配置说明: 1. **日志级别控制**: - `DEBUG`:最详细的日志信息(通常仅用于开发) - `INFO`:确认程序按预期运行 - `WARNING`:潜在问题提示 - `ERROR`:严重问题(部分功能失效) - `CRITICAL`:致命错误(程序可能崩溃) 2. **输出位置控制**: - `FileHandler`:日志写入指定文件(示例中为 application.log) - `StreamHandler`:日志输出控制台(stdout) 3. **格式化符号说明**: - `%(asctime)s`:日志时间 - `%(name)s`:Logger名称 - `%(levelname)s`:日志级别名称 - `%(message)s`:日志内容 - 其他可用符号:`%(filename)s`(文件名)、`%(lineno)d`(行号)、`%(funcName)s`(函数名)等[^2] ### 使用注意事项: 1. **避免重复日志**: ```python # 在程序入口处调用一次即可 logger = setup_logging() ``` 2. **模块化使用**: ```python # 在其他模块中获取Logger import logging logger = logging.getLogger(__name__) logger.info(&#39;跨模块日志&#39;) ``` 3. **日志轮转(高级)**: 使用 `RotatingFileHandler` 可自动分割日志文件: ```python from logging.handlers import RotatingFileHandler # 替换FileHandler为以下代码 file_handler = RotatingFileHandler( &#39;app.log&#39;, maxBytes=5*1024*1024, backupCount=3 ) ``` 此配置会同时记录日志到文件和控制台,不同处理器可设置不同的日志级别,文件保留所有调试信息,控制台只显示重要信息[^1][^2]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值