python logging现学现用 – TimedRotatingFileHandler使用方法

本文介绍Python中TimedRotatingFileHandler模块的应用,该模块可根据预设时间自动滚动日志文件,防止日志文件过大。文章通过示例代码展示了如何配置日志级别、文件名、滚动周期及保留文件数量。

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

原文链接:

http://openexz.sinaapp.com/2011/10/12/python-logging%e7%8e%b0%e5%ad%a6%e7%8e%b0%e7%94%a8-timedrotatingfilehandler%e4%bd%bf%e7%94%a8%e6%96%b9%e6%b3%95/

TimedRotatingFileHandler这个模块是满足文件名按时间自动更换的需求,这样就可以保证日志单个文件不会太大。
用法很简单,示例代码:

import logging
import logging.handlers
 
# logging初始化工作
logging.basicConfig()
 
# nor的初始化工作
nor = logging.getLogger("nor")
nor.setLevel(logging.INFO)
 
# 添加TimedRotatingFileHandler到nor
# 定义一个1分钟换一次log文件的handler
filehandler = logging.handlers.TimedRotatingFileHandler(
        "logging_test2", 'M', 1, 0)
# 设置后缀名称,跟strftime的格式一样
filehandler.suffix = "%Y%m%d-%H%M.log"
nor.addHandler(filehandler)

 

本地代码:

import logging
from logging.handlers import TimedRotatingFileHandler

root = logging.getLogger()
if len(root.handlers) == 0: #避免重复
    level = logging.INFO
    filename = os.path.join(HERE,'static/log/log.log').replace('\\','/')
    #filename = 'D:\\workspace_myeclipse\\djangopro_dwz\\log.log'
    format = '%(asctime)s %(levelname)s %(module)s.%(funcName)s Line:%(lineno)d%(message)s'
    hdlr = TimedRotatingFileHandler(filename,"M",1,10)
    fmt = logging.Formatter(format)
    hdlr.setFormatter(fmt)
    root.addHandler(hdlr)
    root.setLevel(level)




 

TimedRotatingFileHandler的构造函数定义如下(2.5版本API为例):

TimedRotatingFileHandler(filename [,when [,interval [,backupCount]]])

filename 是输出日志文件名的前缀

when 是一个字符串的定义如下:
“S”: Seconds
“M”: Minutes
“H”: Hours
“D”: Days
“W”: Week day (0=Monday)
“midnight”: Roll over at midnight

interval 是指等待多少个单位when的时间后,Logger会自动重建文件,当然,这个文件的创建
取决于filename+suffix,若这个文件跟之前的文件有重名,则会自动覆盖掉以前的文件,所以
有些情况suffix要定义的不能因为when而重复。

backupCount 是保留日志个数。默认的0是不会自动删除掉日志。若设10,则在文件的创建过程中
库会判断是否有超过这个10,若超过,则会从最先创建的开始删除。

 

### Python使用Logging模块进行日志记录 #### 导入Logging模块并设置基本配置 为了开始使用`logging`模块,在脚本文件的顶部导入该模块,并调用`basicConfig()`函数来设定一些必要的参数,比如日志级别、格式以及目标输出位置等[^1]。 ```python import logging # 配置日志的基本设置 logging.basicConfig( level=logging.DEBUG, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s", filename='app.log', # 将日志写入指定文件 filemode='w' # 覆盖模式打开日志文件,默认是追加模式'a' ) ``` #### 创建Logger对象 虽然可以直接通过`logging`模块的方法(如`debug()`, `info()`等)发送消息给默认的日志处理器,但是更推荐的做法是创建自己的`Logger`实例。这允许更加精细地控制不同部分的日志行为[^2]。 ```python logger = logging.getLogger('my_logger') handler = logging.StreamHandler() formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s') handler.setFormatter(formatter) logger.addHandler(handler) # 设置最低严重程度;低于这个级别的日志将被忽略 logger.setLevel(logging.INFO) ``` #### 记录不同类型的消息 一旦完成了上述准备工作之后就可以利用不同的方法来记录各种类型的事件了。每种类型对应着特定的颜色编码和重要性等级: - `DEBUG`: 开发期间用于调试目的的信息; - `INFO`: 描述正常操作流程的一般状态更新; - `WARNING`: 表明某些意外情况发生但不影响整体功能的通知; - `ERROR`: 报告错误条件下的异常状况; - `CRITICAL`: 极其严重的错误,可能导致应用程序无法继续运行下去[^3]。 ```python try: result = 10 / 0 except ZeroDivisionError as e: logger.error(f"An error occurred while dividing by zero: {e}") finally: logger.info("Operation completed.") ``` #### 自定义日志格式与多目的地输出 除了简单的文本形式外还可以自定义日志条目所呈现的方式,甚至同时向多个地方发送相同的内容副本。例如,既保存至本地磁盘又显示于终端屏幕上[^4]。 ```python console_handler = logging.StreamHandler() file_handler = logging.FileHandler('error_log.txt') # 定义两种不同的格式化器分别应用于两个处理程序上 simple_formatter = logging.Formatter('%(levelname)s:%(message)s') detailed_formatter = logging.Formatter('%(asctime)s-%(name)s-%(levelname)s-%(message)s') console_handler.setFormatter(simple_formatter) file_handler.setFormatter(detailed_formatter) # 添加这两个新的处理器到我们的logger里去 logger.addHandler(console_handler) logger.addHandler(file_handler) # 测试一下效果 logger.warning('This will appear on screen and also saved into the file.') ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值