python使用logging实现信息既在桌面输出,又在log文件中写入

Python日志模块详解
import logging
from logging import handlers

class Logger(object):
    level_relations = {
        'debug':logging.DEBUG,
        'info':logging.INFO,
        'warning':logging.WARNING,
        'error':logging.ERROR,
        'crit':logging.CRITICAL
    }#日志级别关系映射

    def __init__(self,filename,level='info',fmt='%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s'):
        self.logger = logging.getLogger(filename)
        format_str = logging.Formatter(fmt)#设置日志格式
        self.logger.setLevel(self.level_relations.get(level))#设置日志级别
        sh = logging.StreamHandler()#往屏幕上输出
        sh.setFormatter(format_str) #设置屏幕上显示的格式
        
        th = handlers.TimedRotatingFileHandler(filename = filename, encoding='utf-8')
        th.setFormatter(format_str)#设置文件里写入的格式
        
        self.logger.addHandler(sh) #代表在屏幕上输出,如果注释掉,屏幕将不输出
        self.logger.addHandler(th) #代表在log文件中输出,如果注释掉,将不再向文件中写入数据

if __name__ == '__main__':
    log = Logger('all.log',level='debug')
    log.logger.debug('debug')
    log.logger.info('info')
    log.logger.warning('警告')
    log.logger.error('报错')
    log.logger.critical('严重')
    Logger('error.log', level='error').logger.error('error')

可以直接将main函数上面的代码粘贴进文件中,使用import对其进行调用,实现输出内容既可以写到文件中,也可以输出到屏幕上,也可以利用self.logger.addHandler(sh) #代表在屏幕上输出,如果注释掉,屏幕将不输出 self.logger.addHandler(th) #代表在log文件中输出,如果注释掉,将不再向文件中写入数据控制是否输出在屏幕或者是否输出到文件。

下面是代码运行截图:

屏幕截图:
在这里插入图片描述
log文件截图:
在这里插入图片描述

可以明显看出,屏幕输出和log文件中写入的内容是一样的!

<think>首先,用户的问题是:如何在Pythonlogging模块中记录时间戳到日志文件。用户提到“将时间戳信息保存到输出文件中”,所以我需要解释如何配置logging模块来包括时间戳。 从系统指令中,我需要: - 使用$...$格式的行内数学表达式,但这个问题是关于logging模块的,可能没有数学内容,所以可能不需要。 - 独立公式用$$...$$,但同样,这里可能不适用。 - 使用中文回答。 - 生成相关问题。 - 在引用的段落末尾添加引用标识,如[^1]。参考了提供的引用,如[^1]、[^2]等,这些是关于logging模块的,所以我应该整合它们。 提供的引用: - [^1]: 关于日志文件分割的处理器。 - [^2]: 关于NullHandler的使用。 - [^3]: 关于basicConfig的配置,包括时间格式。 - [^4]: 关于logging模块的内部文件。 用户的问题焦点是记录时间戳到日志文件,所以引用[^3]最相关,因为它提到了format和datefmt参数。 我的回答结构: - 清晰、逐步解决问题。 - 确保真实可靠。 - 使用中文。 步骤: 1. 解释如何配置logging来包括时间戳。 2. 使用basicConfig方法,设置format参数来包括时间戳。 3. 指定datefmt来定制时间格式。 4. 提供一个示例代码。 从引用[^3]: - format: '%(asctime)s' 会添加时间戳。 - datefmt: 定义时间格式,如 '%a, %Y-%m-%d %H:%M:%S'。 所以,在回答中,我应该: - 描述basicConfig的使用。 - 展示如何设置format和datefmt。 - 给出一个Python代码示例。 - 在相关部分添加引用标识。 最后,生成相关问题。 完整回答结构: 1. 介绍问题:用户想在日志中记录时间戳。 2. 解释解决方案:使用logging.basicConfig配置格式。 3. 提供代码示例。 4. 解释关键部分。 5. 添加相关问题。 确保语言是中文。</think>### 在Pythonlogging模块中记录时间戳到日志文件 要在Pythonlogging模块中将时间戳信息保存到日志文件中,您可以通过配置日志格式来实现。核心方法是使用`logging.basicConfig()`函数,通过设置`format`参数来包含时间戳占位符`%(asctime)s`,并可选地使用`datefmt`参数自定义时间格式。下面我将逐步解释实现过程,确保配置简单可靠。 #### 步骤详解 1. **理解时间戳记录原理**: - Pythonlogging模块允许您自定义日志消息的格式。`%(asctime)s`是一个内置占位符,代表时间戳(asctime表示“ASCII time”)。 - 默认情况下,`%(asctime)s`会输出类似`2023-10-05 14:30:00,123`的时间戳,但您可以通过`datefmt`参数调整格式。 - 日志输出文件时,需在`basicConfig()`中指定`filename`参数,确保时间戳被写入文件[^3]。 2. **配置日志格式**: - 使用`logging.basicConfig()`进行全局配置。 - **关键参数**: - `format`: 定义日志消息的模板。包括`%(asctime)s`来嵌入时间戳。 - `datefmt`: 可选参数,用于自定义时间格式(例如,`%Y-%m-%d %H:%M:%S`表示年-月-日 时:分:秒)。 - `filename`: 指定日志文件路径,时间戳将直接保存到该文件。 - `level`: 设置日志级别(如`logging.INFO`)。 - 如果不设置`datefmt`,时间戳将使用默认格式;设置后,格式更灵活[^3]。 3. **完整代码示例**: 以下是一个Python脚本示例,演示如何配置logging模块将时间戳记录到文件: ```python import logging # 配置日志设置,包括时间戳 logging.basicConfig( level=logging.INFO, # 设置日志级别为INFO format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', # 包含时间戳的格式 datefmt='%Y-%m-%d %H:%M:%S', # 自定义时间格式:年-月-日 时:分:秒 filename='app.log', # 日志输出文件app.log filemode='a' # 追加模式,避免覆盖旧日志 ) # 测试日志记录 logging.info("这是一条测试日志,时间戳已保存到文件。") ``` - **运行结果**: - 执行脚本后,日志文件`app.log`中会添加一行,如: ``` 2023-10-05 14:30:00 - root - INFO - 这是一条测试日志,时间戳已保存到文件。 ``` - 时间戳格式为`%Y-%m-%d %H:%M:%S`,您可以根据需求调整`datefmt`(例如,添加毫秒用`%f`)。 4. **注意事项**: - **文件路径处理**:确保`filename`指定的目录存在,否则会引发异常。建议使用绝对路径(如`/var/log/myapp.log`)以避免权限问题[^3]。 - **高级定制**:如果需要更复杂的日志分割(如按时间或大小分割),可以结合`logging.handlers.TimedRotatingFileHandler`,它支持自动分割文件并保留时间戳[^1]。 - **错误处理**:如果日志文件无法写入,检查文件权限或使用`try-except`捕获IOError。 - **性能影响**:记录时间戳对性能影响很小,但在高频日志场景下,建议使用异步日志处理。 通过以上配置,时间戳会被自动记录到日志文件中。如果您在团队项目中使用,确保所有日志调用一致,避免格式冲突[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值