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')