python logging 记录日志,躲避一个坑

import logging
import logging.handlers
from enum import Enum
import time

class LOGLEVEL(Enum):
    LOG_INFO = "info"
    LOG_WARN = "warning"
    LOG_ERROR = "error"



def logInfo(logLevel, logData):
    logger = logging.getLogger("./log/text.txt")
    format_str = logging.Formatter("%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s")
    logger.setLevel(level=logging.INFO)

    sh = logging.StreamHandler()  # 屏幕上输出
    sh.setFormatter(format_str)  # 设置屏幕上显示的格式

    th = logging.handlers.TimedRotatingFileHandler(filename="./log/text.txt", when="S", backupCount=5, encoding="utf-8") #根据时间自动切换文件
    # th = logging.handlers.RotatingFileHandler(filename="./log/text.txt", maxBytes=1024*1024, backupCount=2, encoding="utf-8") #根据文件大小自动切换文件
    th.setFormatter(format_str) #保存文件的格式

    logger.addHandler(sh)
    logger.addHandler(th)

    if logLevel == LOGLEVEL.LOG_INFO:
        logger.info(logData)
    elif logLevel == LOGLEVEL.LOG_WARN:
        logger.warning(logData)
    elif logLevel == LOGLEVEL.LOG_ERROR:
        logger.error(logData)
    else:
        logger.debug(logData)

    logger.removeHandler(sh)#防止第几条日志打印几次
    logger.removeHandler(th)


if __name__ == '__main__':
    logInfo(LOGLEVEL.LOG_INFO, "info")
    logInfo(LOGLEVEL.LOG_WARN, "warning")
    logInfo(LOGLEVEL.LOG_ERROR, "error")

坑: 第几条日志打印几次

说明: 按时间分割日志,目前只有按秒分割成功,其他尝试都失败,若有解决办法,欢迎留言

 

另外一种方法

import logging, logging.handlers
import time

'''
TimedRotatingFileHandler构造函数声明
class logging.handlers.TimedRotatingFileHandler(filename, when='h', interval=1, backupCount=0, encoding=None, delay=False, utc=False, atTime=None)
filename    日志文件名前缀
when        日志名变更时间单位
    'S' Seconds
    'M' Minutes
    'H' Hours
    'D' Days
    'W0'-'W6' Weekday (0=Monday)
    'midnight' Roll over at midnight
interval    间隔时间,是指等待N个when单位的时间后,自动重建文件
backupCount 保留日志最大文件数,超过限制,删除最先创建的文件;默认值0,表示不限制。
delay       延迟文件创建,直到第一次调用emit()方法创建日志文件
atTime      在指定的时间(datetime.time格式)创建日志文件。
'''

def test_TimedRotatingFileHandler():
    fileName = './log/logInfo'
    # 定义日志输出格式
    fmt_str = "%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s"
    # 初始化 设置日志级别
    logging.basicConfig(level=logging.INFO)

    # 创建TimedRotatingFileHandler处理对象
    # 间隔5(S)创建新的名称为myLog%Y%m%d_%H%M%S.log的文件
    fileshandle = logging.handlers.TimedRotatingFileHandler(filename=fileName, when='S', interval=5, backupCount=3)
    # fileshandle = logging.handlers.RotatingFileHandler(filename='./log/myLog', maxBytes=1024, backupCount=2, encoding="utf-8")
    # 设置日志文件后缀,以当前时间作为日志文件后缀名。
    fileshandle.suffix = "%Y_%m_%d_%H_%M_%S.log"
    # 设置日志输出格式
    formatter = logging.Formatter(fmt_str)
    fileshandle.setFormatter(formatter)

    # 添加到日志处理对象集合
    logging.getLogger('').addHandler(fileshandle)

    #打印到屏幕上,与下面打印重复
    sh = logging.StreamHandler()
    sh.setFormatter(formatter)
    logging.getLogger('').addHandler(sh)

if __name__ == '__main__':
    test_TimedRotatingFileHandler()

    # 测试在200s内创建文件多个日志文件
    for i in range(0, 100):
        logging.debug("logging.debug")
        logging.info("logging.info")
        logging.warning("logging.warning")
        logging.error("logging.error")

        time.sleep(2)

 

你可能感兴趣的:(Python)