python-logging模块

Logging模块

用于记录程序运行时的日志

1.logging模块的用法

  简单的输出到屏幕

import logging

logging.warning("user attempted wrong password more than 3 times")
logging.critical("server is down")
输出:
WARNING:root:user attempted wrong password more than 3 times
CRITICAL:root:server is down

  简单写到文件

import logging

logging.basicConfig(filename='example.log', level=logging.INFO)
# level = loggin.INFO意思是,把日志纪录级别设置为INFO,比IFNO日志更高的级别才写入日子文件
logging.debug('This message should go to the log file')  # debug的日志就不会写入
logging.info('So should this')
logging.warning('And this, too')

                   注意:level的等级设置为logging.INFO。debug的日志不会写入文件。

       自定义格式

# 自定义日志格式

logging.basicConfig(filename='log_test.log',
                    level=logging.DEBUG,
                    format='%(asctime)s %(message)s',
                    datefmt='%m/%d/%Y %I:%M:%S %p')
logging.warning('is when this event was logged.')
# %(name)s     Logger的名字
# %(levelno)s     数字形式的日志级别
# %(levelname)s     文本形式的日志级别
# %(pathname)s     调用日志输出函数的模块的完整路径名,可能没有
# %(filename)s     调用日志输出函数的模块的文件名
# %(module)s     调用日志输出函数的模块名
# %(funcName)s     调用日志输出函数的函数名
# %(lineno)d     调用日志输出函数的语句所在的代码行
# %(created)f     当前时间,用UNIX标准的表示时间的浮 点数表示
# %(relativeCreated)d     输出日志信息时的,自Logger创建以 来的毫秒数
# %(asctime)s     字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒
# %(thread)d     线程ID。可能没有
# %(threadName)s     线程名。可能没有
# %(process)d     进程ID。可能没有
# %(message)s     用户输出的消息

2.日志同时输出到屏幕和文件

操作流程

# 1.生成logger对象
# 2.生成handler对象
#   2.1.绑定logger和handler对象
# 3.生成formatter对象
#   3.1 把formatter对象绑定到handler对象
# 4.如果不设置logger级别,那么默认级别是error ,所以err时才会输出到屏幕和界面
# 5.添加日志过滤功能
# 1.生成logger对象
logger = logging.getLogger('web')
# 4.设置日志级别(不设置默认级别为error)
logger.setLevel(logging.INFO)
# 2.生成handler对象
ch = logging.StreamHandler()  # 生成输出屏幕对象
fh = logging.FileHandler('web.log')  # 生成输出文件对象

# 3.生成formatter对象
#   3.1 把formatter对象绑定到handler对象

file_format = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')  # 指定输出文件格式
con_format = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s -%(lineno)d -%(message)s')  # 指定输出屏幕格式

fh.setFormatter(file_format)  # 设置输出文件格式
ch.setFormatter(con_format)  # 设置输出console格式

logger.addHandler(ch)
logger.addHandler(fh)


# 5.添加日志过滤功能类
class IgnoreBackupLogFilter(logging.Filter):
    """忽略带db backup 的日志"""
    def filter(self, record):  # 固定写法
        return "db backup" not in record.getMessage()

# 把信息写入日志


# 添加日志过滤功能
logger.addFilter(IgnoreBackupLogFilter())

logger.debug("test ....")
logger.info("test info ....")
logger.warning("start to run db backup job ....")  # 只有这条不写入日志
logger.error("test error ....")

3.文件截断功能

  当文件越来越大,则需要进行文件截断

# 文件截断功能
from logging import handlers
logger = logging.getLogger(__name__)

log_file = 'timelog.log'
fh = handlers.TimedRotatingFileHandler(filename=log_file,when='S',interval=5,backupCount=3)

formatter = logging.Formatter('%(asctime)s %(module)s:%(lineno)d %(message)s')

fh.setFormatter(formatter)

logger.addHandler(fh)


logger.warning("test1")
logger.warning("test12")
logger.warning("test13")
logger.warning("test14")
原文地址:https://www.cnblogs.com/AYxing/p/8699026.html