Python日志处理

Python日志处理

一、基本概念

1.日志级别

级别Level 对应数值
logging.NOTSET 0
logging.DEBUG 10
logging.INFO 20
logging.WARNING(默认级别) 30
logging.ERROR 40
logging.CRITICAL 50

示例:

logger.setLevel(logging.DEBUG)

2.Formatter

参数 含义
%(message)s 用户自定义要输出的信息
%(asctime)s 当前的日期时间
%(name)s logger实例的名称
%(module)s 使用logger实例的模块名
%(filename)s 使用logger实例的模块的文件名
%(funcName)s 使用logger实例的函数名
%(lineno)d 使用logger实例的代码行号
%(levelname)s 日志级别名称。 %(levelno)s 表示日志级别的数字形式
%(thread)d 使用logger实例的线程号(测试多线程时有用)
%(threadName)s 使用logger实例的线程名称(测试多线程时有用)
%(process)d 使用logger实例的进程号(测试多进程时有用)

示例:

log_formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
log_handler.setFormatter(log_formatter)

3.Handler

常用Handler

  • ① logging.StreamHandler
    输出到控制台
  • ② logging.FileHandler
    输出到指定的日志文件中
  • ③ logging.handlers.RotatingFileHandler
    也是输出到日志文件中,还可以指定日志文件的最大大小和副本数,当日志文件增长到设置的大小后,会先将原日志文件 test.log 重命名,如 test.log.1,然后再创建一个 test.log 继续写入日志。如果设置了副本数 N,则最多只能存在 N 个重命名的日志文件
  • ④ logging.handlers.TimedRotatingFileHandler
    按日期时间保存日志文件,如果设置了滚动周期,则只存在这个周期内的日志文件。比如,只保留一周内的日志
  • ⑤ logging.handlers.SMTPHandler
    捕获到指定级别的日志后,给相应的邮箱发送邮件

示例:

log_handler = logging.StreamHandler()

4.logger实例

示例:

# 创建一个叫my_test的logger实例,如果参数为空则返回root logger
logger = logging.getLogger("my_test")
# 设置日志记录级别
logger.setLevel(logging.DEBUG)
# 创建StreamHandler,输出日志到控制台
log_handler = logging.StreamHandler()
# 设置日志记录格式
log_formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
log_handler.setFormatter(log_formatter)
# 将Handler添加到logger实例上
logger.addHandler(log_handler)

logger.debug("debug:testing...........")
logger.info("info:testing...........")
运行结果

二、输出到日志文件

import logging
logging.basicConfig(filename="test.log", level=logging.DEBUG)
logging.debug('This is debug message')
logging.info('This is info message')
logging.warning('This is warning message')
logging.error('This is error message')
logging.critical('This is critical message')

三、同时输出到控制台和日志文件

示例:

# 创建日志实例
logger = logging.getLogger("project_logger")

# 设置日志记录级别
logger.setLevel(logging.DEBUG)

# 设置日志记录格式
log_formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

# 创建日志文件夹
base_dir = os.path.abspath(os.path.dirname(__file__))
log_dir = os.path.join(base_dir, "logs")
if not os.path.isdir(log_dir):
    os.mkdir(log_dir)

filename = time.strftime("%Y-%m-%d", time.localtime(time.time())) + ".log"

file_handler = logging.FileHandler(os.path.join(log_dir, filename), encoding='utf-8')
file_handler.setFormatter(fmt=log_formatter)
file_handler.setLevel(logging.DEBUG)

stream_handler = logging.StreamHandler()
stream_handler.setFormatter(fmt=log_formatter)
stream_handler.setLevel(logging.INFO)

logger.addHandler(file_handler)
logger.addHandler(stream_handler)

logger.debug('This is debug message')
logger.info('This is info message')
运行结果(控制台)

运行结果(文件)

你可能感兴趣的:(Python日志处理)