为了账号安全,请及时绑定邮箱和手机立即绑定

flask的自带logger和celery的自带logger的使用

标签:
Python

在celery和flask框架中都有自带的logger使用方法。下面记录一下相关的使用。

flask中使用logger

flask中的app对象FLASK()自带了logger方法,其调用的方式为:

from flask import current_app

current_app.logger.error('this is a error')current_app.logger.info('this is a info')current_app.logger.warning('this is a wraning')current_app.logger.debug('this is a debug')

自带的logger其实也是通过python的logging模块创建logger对象得到的,源码为:

# logging.pyfrom logging import getLogger, getLoggerClassdef create_logger(app):
    ...    # 创建一个调试模式下的日志处理器,级别为debug
    debug_handler = DebugHandler()
    debug_handler.setLevel(DEBUG)
    debug_handler.setFormatter(Formatter(DEBUG_LOG_FORMAT))    # 创建一个运行过程的日志处理器,级别为error
    prod_handler = ProductionHandler(_proxy_stream)
    prod_handler.setLevel(ERROR)
    prod_handler.setFormatter(Formatter(PROD_LOG_FORMAT))    # 获取应用的名字,即app = Flask(app.name)传入的参数名,然后创建一个logger对象
    logger = getLogger(app.logger_name)    # 先清空以前所有的处理器
    del logger.handlers[:]
    logger.__class__ = DebugLogger    # 加入新的处理器
    logger.addHandler(debug_handler)
    logger.addHandler(prod_handler)    # 默认情况下不继承
    logger.propagate = False

    return logger

说明:当程序调用current_app.logger时,会得到create_logger函数返回的logger对象,使用的是ProductionHandler处理器,日志的输出格式为:

PROD_LOG_FORMAT = '[%(asctime)s] %(levelname)s in %(module)s: %(message)s'

但很多时候我们不满意自带的日志输出格式,想要自定义,那么就需要加载自己的日志配置文件。

加载自定义的配置文件

  • 在配置文件中需要配置以app.logger_name为名称的logger对象;如:app.logger_name='app'

[loggers]keys=root,app[handlers]keys=consoleHandler[formatters]keys=simpleFormatter[logger_root]level=INFOhandlers=consoleHandler[logger_app]level=INFOhandlers=consoleHandlerqualname=apppropagate=0[handler_consoleHandler]class=StreamHandlerlevel=INFOformatter=simpleFormatterargs=(sys.stdout,)[formatter_simpleFormatter]format=%(asctime)s - %(name)s - %(levelname)s [%(pathname)s:%(lineno)d]: %(message)s
  • 加载文件

# app.pyapp = Flask(__name__)# 在载入配置文件之前必须先调用一次app.logger得到一个logger对象,然后才能载入配置文件,否则无效app.logger.info('this is a info')
logging.config.fileConfig(Config.FILEPATH)

注意:在载入配置文件之前必须先调用一次app.logger得到一个logger对象,然后才能载入配置文件,否则无效。

在celery中使用logger

celery也有自带的logger,使用方法:

from celery.utils.log import get_task_logger# 创建一个logger对象logger = get_task_logger('name')

celery的logger调用的仍然是logging模块的logger.

# 源码# get_task_logger函数调用了get_logger函数# 传入一个字符串获取一个logger对象def get_logger(logger):
    """Get logger by name."""
    # 判断该参数是不是字符串,是就获取一个logger对象
    if isinstance(logger, string_t):
        logger = logging.getLogger(logger)    # 没有处理器就添加NullHandler处理器
    if not logger.handlers:
        logger.addHandler(logging.NullHandler())    return logger
  • 其相关的配置可以在celery的配置文件中设置;

# 在4.0版本后改成了小写,但是原来的还没有弃用CELERYD_HIJACK_ROOT_LOGGER :默认true,先前所有的logger的配置都会失效,可以通过设置false禁用定制自己的日志处理程序;
CELERYD_LOG_COLOR :是否开启不同级别的颜色标记,默认开启;
CELERYD_LOG_FORMAT :设置celery全局的日志格式;默认格式:"[%(asctime)s: %(levelname)s/%(processName)s] %(message)s"CELERYD_TASK_LOG_FORMAT:设置任务日志格式,默认:"[%(asctime)s: %(levelname)s/%(processName)s [%(task_name)s(%(task_id)s)] %(message)s"CELERY_REDIRECT_STDOUTS:设置标准输入输出重定向到当前的处理器,默认为 trueCELERY_REDIRECT_STDOUTS_LEVEL:设定标准输入输出重定向到当前的处理器日志的输出级别;即指定使用print()输出的是什么级别的日志记录;默认wraning;

注意:

  1. 由于celery的运行是独立的,在flask中定义的logger对象的配置在celery的程序中是失效的,必须使用get_task_logger创建logger;

  2. 指定celery日志的输出等级,通过启动时用--loglevel参数来指定;

原文出处

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消