class RotatingFileHandler( filename[, mode[, maxBytes[, backupCount]]])
返回RotatingFileHandler 类 的新实例。指定的文件被打开并用作记录的流。如果未指定模式,则使用a。默认情况下,文件无限增长。
RotatingFileHandler 允许我们在当前日志文件达到一定大小时将我们的日志语句轮换到一个新文件中。
在此示例中,我们将对其进行设置,以便当它达到 500 字节时,我们将旋转到一个新文件中,最多可备份 2 次。
import logging
import logging.handlers as handlers
import time
logger = logging.getLogger('my_app')
logger.setLevel(logging.INFO)
logHandler = handlers.RotatingFileHandler('app.log', maxBytes=500, backupCount=2)
logHandler.setLevel(logging.INFO)
logger.addHandler(logHandler)
def main():
while True:
time.sleep(1)
logger.info("A Sample Log Statement")
main()
执行此操作后,您应该注意到每次 app.log 超过 500 个字节时,它就会关闭并重命名为 app.log.x,其中 x 的值会递增,直到达到我们设置的 backupCount 的值。
class TimedRotatingFileHandler( filename [,when [,interval [,backupCount]]])
返回TimedRotatingFileHandler 类 的新实例。指定的文件被打开并用作记录的流。在旋转时,它还会设置文件名后缀。轮换基于时间和间隔的乘积发生。
你可以使用when来指定interval的类型。可能的值列表是,注意它们不区分大小写:
| Value | Type of interval |
|:--------:|:---------------------:|
| S | Seconds |
| M | Minutes |
| H | Hours |
| D | Days |
| W | Week day (0=Monday) |
| midnight | Roll over at midnight |
TimedRotatingFileHandler 允许我们按时间片捕获日志文件。
import logging
import logging.handlers as handlers
import time
logger = logging.getLogger('my_app')
logger.setLevel(logging.INFO)
logHandler = handlers.TimedRotatingFileHandler('timed_app.log', when='M', interval=1)
logHandler.setLevel(logging.INFO)
logger.addHandler(logHandler)
def main():
while True:
time.sleep(1)
logger.info("A Sample Log Statement")
main()
运行此代码将无限期地每分钟创建新的日志文件。我们可以在logHandler 实例上设置backupCount 参数,它将限制我们创建的日志文件的数量。
使用适当的日志级别
使用TimedRotatingFileHandler 和RotatingFileHandler 可以执行以下操作,例如将所有错误消息记录到旋转文件,但将所有正常日志文件记录到 TimedRotatingFileHandler,因为我们希望我们可以期待更多它们比错误消息。
两个级别的记录被拆分为两个不同的日志级别:INFO 和 ERROR 到两个不同的位置。
import logging
import logging.handlers as handlers
import time
logger = logging.getLogger('my_app')
logger.setLevel(logging.INFO)
## Here we define our formatter
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logHandler = handlers.TimedRotatingFileHandler('normal.log', when='M', interval=1, backupCount=0)
logHandler.setLevel(logging.INFO)
logHandler.setFormatter(formatter)
errorLogHandler = handlers.RotatingFileHandler('error.log', maxBytes=5000, backupCount=0)
errorLogHandler.setLevel(logging.ERROR)
errorLogHandler.setFormatter(formatter)
logger.addHandler(logHandler)
logger.addHandler(errorLogHandler)
def main():
while True:
time.sleep(1)
logger.info("A Sample Log Statement")
logger.error("An error log statement")
main()
您应该注意到,当您运行此程序时会创建 3 个日志文件。 error.log 将仅包含级别为 ERROR 或更高级别的日志。 normal.log 将包含从我们的应用程序中注销的所有日志消息的组合。
这些只是我认为在实现自己的日志系统时很重要的几件事。