logging日志模块的使用,TimedRotatingFileHandler和RotatingFileHandler日志分割

版权声明:本文为博主原创文章,转载请注明出处,感谢! https://blog.csdn.net/ljj_18539663587/article/details/88652446

logging日志模块的使用,TimedRotatingFileHandler和RotatingFileHandler日志分割

一.代码中直接使用

单个脚本文件中可以直接使用

import logging

# 配置日志格式,日期格式,日志文件名,日志等级
logFormat = "%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s"
dateFormat = "%Y/%m/%d %H:%M:%S"
logging.basicConfig(filename='test.log', filemode='a+', format=logFormat, datefmt=dateFormat, level=logging.INFO)

# 伪造异常捕获
def catch_exception():
    try:
        result = 2 // 0
        logging.info(result)
    except Exception as e:
        logging.exception(e)

if __name__ == '__main__':
    catch_exception()

二.封装到函数中使用

自定义日志函数,参数为日志文件保存路径,所有信息全部打印在test.log文件当中.

建议把日志函数独立封装在py文件当中,使用时直接导入后调用,这里为了方便展示直接写在一个文件当中.

import logging

def my_log(fileName):
    # 创建一个日志记录器logger,设置全局等级
    logger = logging.getLogger("logger")
    logger.setLevel(logging.INFO)
    # 创建一个文件记录日志的handler,设置级别为info
    fileHandler = logging.FileHandler(filename="{}.log".format(fileName))
    fileHandler.setLevel(logging.INFO)
    # 创建一个全局的日志格式
    formatter = logging.Formatter('%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s', datefmt='%Y/%m/%d %H:%M:%S')
    # 将日志格式添加到fileHandler
    fileHandler.setFormatter(formatter)
    # 将日志handler添加到logger中
    logger.addHandler(fileHandler)
    return logger

# 伪造异常捕获,调用封装的日志函数my_log(),传入文件路径
def catch_exception():
    logger = my_log('test')
    try:
        result = 2 // 0
        logger.info(result)
    except Exception as e:
        logger.exception(e)

if __name__ == '__main__':
    catch_exception()

三.日志文件和terminal划分等级输出

代码中调用日志函数后,编辑时所有信息全部添加到文件当中,查看报错信息需要打开日志文件,很不友好.

logging提供文件和terminal同时输出的handler,terminal栏输出我们想看到的error信息.

import logging

def my_log(fileName):
    logger = logging.getLogger("logger")
    logger.setLevel(logging.INFO)
    # 创建一个文件记录日志的handler,设置级别为info
    fileHandler = logging.FileHandler(filename="{}.log".format(fileName))
    fileHandler.setLevel(logging.INFO)
    # 同时创建一个在终端输出的handler,级别为error
    streamHandler = logging.StreamHandler()
    streamHandler.setLevel(logging.ERROR)

    formatter = logging.Formatter('%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s', datefmt='%Y/%m/%d %H:%M:%S')

    # 将日志格式器添加到两个handler中
    fileHandler.setFormatter(formatter)
    streamHandler.setFormatter(formatter)

    # 将两个handler添加到logger中
    logger.addHandler(fileHandler)
    logger.addHandler(streamHandler)
    return logger

def catch_exception():
    logger = my_log('test1')
    try:
      	logger.info('只在日志文件中展示')
        result = 2 // 0
        logger.info(result)
    except Exception as e:
        logger.exception(e)  # 报错信息除了记录在文件当中,终端也同时输出

if __name__ == '__main__':
    catch_exception()

四.TimedRotatingFileHandler按时间间隔分割日志文件

TimedRotatingFileHandler参数介绍:

filename:日志文件名

when:时间单位 S–秒 M–分 H–时 D—天 大小写不敏感

interval:间隔多长时间分割一个日志文件

backupCount:保留最近文件的个数

生成的日志文件格式基本固定,如果需要更改还需要修改对应的正则,日志格式( runTest.2019-03-18_14:15:20.log)

import re
import time
import logging.handlers

def my_log():
    logger = logging.getLogger('logger')
    logger.setLevel(logging.INFO)

    formatter = logging.Formatter('%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s', datefmt='%Y/%m/%d %H:%M:%S')
		# 设置时间间隔,保留文件个数,日志名
    filehandler = logging.handlers.TimedRotatingFileHandler(filename='runTest', when='s', interval=10, backupCount=3)
    # 设置日志后缀,和对应的正则,一定要设置对才能得到想要的结果
    filehandler.suffix = '%Y-%m-%d_%H:%M:%S.log'   
    filehandler.extMatch = re.compile(r'^\d{4}-\d{2}-\d{2}_\d{2}:\d{2}:\d{2}.log$')

    filehandler.setFormatter(formatter)

    logger.addHandler(filehandler)
    return logger

if __name__ == '__main__':
    logger = my_log()
    while True:
        time.sleep(1)   # 间隔一秒循环执行,一段时间后中断执行,验证日志文件时间和个数,是否和设置的一样
        try:
            a = 3 / 0
        except Exception as e:
            logger.exception(e)

五.RotatingFileHandler按照文件大小分割日志文件

代码实现:以日志文件大小10B进行分割,保留最近5个文件(具体情况自己设定参数,此处是为了快速展示输出的效果)

项目中日志文件一般都按照时间进行分割

import time
import logging.handlers

def my_log():
    logger = logging.getLogger('logger')
    logger.setLevel(logging.INFO)

    formatter = logging.Formatter('%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s', datefmt='%Y/%m/%d %H:%M:%S')

    # maxBytes文件大小 单位为B ,backupCount最大备份数 生成的日志文件名称格式 runTest.log.1
    filehandler = logging.handlers.RotatingFileHandler(filename='runTest.log', maxBytes=10, backupCount=5)

    filehandler.setFormatter(formatter)
    logger.addHandler(filehandler)
    return logger

if __name__ == '__main__':
    logger = my_log()
    while True:
        time.sleep(1)
        try:
            a = 3 / 0
        except Exception as e:
            logger.exception(e)

猜你喜欢

转载自blog.csdn.net/ljj_18539663587/article/details/88652446