Python3 - Flask之logging日志的使用

Posted 韩俊强

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python3 - Flask之logging日志的使用相关的知识,希望对你有一定的参考价值。

文章目录

前言:
日志是一种可以追踪某些软件运行时所发生事件的方法;软件开发人员可以向他们的代码中调用日志记录相关的方法表明发生了某些事情;一个事件可以用一个可包含可选变量数据的消息来描述;事件也有重要性的概念,这个重要性也可以称为严重性级别(level)

0.实施步骤

Logging的使用就是三个步骤:

  • 创建记录器
  • 日志的格式、等级设置
  • 添加记录器

1.日志等级说明

等级: DEBUG < INFO < WARNING < ERROR < CRITICAL

DEBUG : 最详细的日志信息,主要的应用场景问题的诊断,只限于开发人员使用的,用来在开发过程中进行调试

INFO : 详细程度仅次于debug模式,主要来记录关键节点的信息,确定程序是否正常如预期完成,一般的使用场景是重要的业务处理已经结束,我们通过这些INFO级别的日志信息,可以很快的了解应用正在做什么。

WARNING : 当某些不被期望的事情发生的时候,需要记录的信息,比如磁盘即将存满,注意当前的程序一依旧可以正常运行,不报错。也就是说发生这个级别的问题时,处理过程可以继续,但必须要对这个问题给予额外的关注。

ERROR : 出现严重问题,导致某些功能不能正常运行记录信息

CRITICAL: 系统即将崩溃或者已经崩溃

注意:
DEBUG: 设置的话,那么使用 app.logger 打印的日志仍会不分等级均记录,而系统运行日志才会按照设置的等级进行记录。

WARNING: 这个等级,那么不管是 app.logger 打印的日志, 还是系统运行日志, 均按照设置等级进行记录。

2.日志分割

LogHandle 封装: 自定义日志的格式、等级设置;
这里分别使用了以文件大小分割时间分割日志方式实例:

import os
import logging
import time
from logging.handlers import RotatingFileHandler, TimedRotatingFileHandler


# log配置,实现日志自动按日期生成日志文件
def make_dir(make_dir_path):
    path = make_dir_path.strip()
    if not os.path.exists(path):
        os.makedirs(path)


def getLogHandler():
    # 日志地址
    log_dir_name = "../Logs"
    # 文件名,以日期作为文件名
    log_file_name = 'logger-' + time.strftime('%Y-%m-%d', time.localtime(time.time())) + '.log'
    # 创建日志文件
    log_file_folder = os.path.abspath(
        os.path.join(os.path.dirname(__file__), os.pardir)) + os.sep + log_dir_name
    make_dir(log_file_folder)
    log_file_str = log_file_folder + os.sep + log_file_name

    # 默认日志等级的设置
    logging.basicConfig(level=logging.WARNING)

    # 基于文件大小分割
    # 创建日志记录器,指明日志保存路径,每个日志的大小,保存日志的上限
    # file_log_handler = RotatingFileHandler(log_file_str, maxBytes=1024 * 1024, backupCount=10, encoding='UTF-8')

    '''
    # 基于时间分割
    # 往文件里写入指定间隔时间自动生成文件的Handler
    # 实例化TimedRotatingFileHandler
    # interval是时间间隔,backupCount是备份文件的个数,如果超过这个个数,就会自动删除,when是间隔的时间单位,单位有以下几种:
    # S 秒
    # M 分
    # H 小时
    # D 天
    # 'W0'-'W6' 每星期(interval=0时代表星期一:W0)
    # midnight 每天凌晨
    '''
    file_log_time_handler = TimedRotatingFileHandler(filename=log_file_str, when='D', backupCount=10, encoding='utf-8')

    # 设置日志的格式                   发生时间    日志等级     日志信息文件名      函数名          行数        日志信息
    formatter = logging.Formatter(
        '%(asctime)s - %(levelname)s - %(filename)s - %(funcName)s - %(lineno)s - %(message)s')

    # 将日志记录器指定日志的格式
    # file_log_handler.setFormatter(formatter)
    file_log_time_handler.setFormatter(formatter)

    # 日志等级的设置
    # file_log_handler.setLevel(logging.WARNING)

    return file_log_time_handler

3.创建记录器

def create_app():
    app = Flask(__name__, static_folder='../static')
    app.config.from_object(ProductionConfig)
    # 日志
    app.logger.addHandler(LogHandle.getLogHandler())
    # 请求日志: 每一次请求前执行
    @app.before_request
    def log_each_request():
        app.logger.info('【请求方法】【请求路径】【请求地址】'.format(request.method, request.path, request.remote_addr))
		# 激活上下文
    ctx = app.app_context()
    ctx.push()

    print(app.url_map)
    return app

4.添加记录器

# flask app必须要上下文衔接统一(一个线程中)
from flask import Flask, current_app

# 测试一下
current_app.logger.info('info log')
current_app.logger.debug('debug log')
current_app.logger.warning('warning log')
current_app.logger.error('error log')
current_app.logger.critical('critical')

打印:

2022-03-18 16:41:23,388 - INFO - __init__.py - check_sign - 18 - info log
2022-03-18 16:41:23,388 - DEBUG - __init__.py - check_sign - 19 - debug log
2022-03-18 16:41:23,388 - WARNING - __init__.py - check_sign - 20 - warning log
2022-03-18 16:41:23,388 - ERROR - __init__.py - check_sign - 21 - error log
2022-03-18 16:41:23,388 - CRITICAL - __init__.py - check_sign - 22 - critical

需要注意: 测试时可能不打印, 放在生产环境即会打印.

以上是关于Python3 - Flask之logging日志的使用的主要内容,如果未能解决你的问题,请参考以下文章

python3-flask-3将信息写入日志

Flask之日志的使用

Python3之logging模块浅析

flask框架之日志的配置

Python3之logging模块

flask日志