我可以在Celery任务中使用泛型logging.Logger()吗?

时间:2017-06-05 15:16:40

标签: python logging celery python-3.4

文件说

  

可以使用名为“celery.task”的特殊记录器,您可以从此记录器继承,以自动获取任务名称和唯一ID作为日志的一部分。

这还不够。有更详细的信息吗?具体来说,它默认定义了哪些处理程序和格式字符串?为什么我要继承呢?我可以使用通用logging.Logger()吗?从celery任务(不是Django)记录到文件的最佳做法是什么?等等。谢谢。

1 个答案:

答案 0 :(得分:4)

  

我可以使用通用的logging.Logger()代替吗?

是的,您可以使用通用的Python / Django记录器。 而不是logger = get_task_logger(__name__)只需选择getLogger

import logging
logger = logging.getLogger(__name__)
  

我为什么要继承它?

使用celery.task的好处是:

  

自动获取任务名称和唯一ID作为日志的一部分。

本身使用标准Python logging lib。

  

这还不够。有更详细的信息吗?   具体来说,它默认定义了哪些处理程序和格式字符串?

默认使用WatchedFileHandler中的logging.handlers 您可以查看celery.app.log文档,它已在setup_handler方法中设置。

  

从celery任务记录到文件的最佳做法是什么?   (不是Django)?等

<强> 1。直接在模块中 - 您可以简单地将所有内容放在模块的顶部 - 定义处理程序,同时让记录器分配它:

import logging

# ---- set up logging to file ---
logging.basicConfig(level=logging.DEBUG,
                    format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s',
                    datefmt='%m-%d %H:%M',
                    filename='/temp/myapp.log',
                    filemode='w')
# --- define a Handler ---
console = logging.StreamHandler()
console.setLevel(logging.INFO)
# --- set a format which is simpler for console use ---
formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s')
# --- tell the handler to use this format ---
console.setFormatter(formatter)
# --- add the handler to the logger ---
logging.getLogger('').addHandler(console)

<强> 2。使用logging_config字典 - dictConfig :一个更好看的练习。

import logging
from logging.config import dictConfig

logging_config = dict(
    version = 1,
    formatters = {
        'f': {'format':
              '%(asctime)s %(name)-12s %(levelname)-8s %(message)s'}
        },
    handlers = {
        'h': {'class': 'logging.StreamHandler',
              'formatter': 'f',
              'level': logging.DEBUG}
        },
    root = {
        'handlers': ['h'],
        'level': logging.DEBUG,
        },
)

dictConfig(logging_config)

logger = logging.getLogger()
logger.debug('often makes a very good meal of %s', 'visiting tourists')

第3。使用单独的日志记录格式文件 - *.ini

[loggers]
# list of loggers
keys=root,log02

[handlers]
# list of handlers    
keys=hand01,hand02

[formatters]
# list of formatters    
keys=form01,form02

[logger_root]
# config for 'root' logger    
level=NOTSET
handlers=hand01

[handler_hand01]
# config for handler hand01    
class=StreamHandler
level=NOTSET
formatter=form01
args=(sys.stdout,)

[handler_hand02]
## config for handler hand02     
class=FileHandler
level=DEBUG
formatter=form02
args=('python.log', 'w')

[formatter_form01]
# config for formatter form01    
format=F1 %(asctime)s %(levelname)s %(message)s
datefmt=
class=logging.Formatter

<强> 4。单独的课程 - 最后但并非最不重要的是,更优雅的解决方案是将所有这些作为单独的模块(Class),并在需要时使用特定标志导入它:

import logging
from config import LOG, LOGGING

class Logger:
    def __init__(self, logf=None, logger_name=None, debug=None, rotation=None):
        self.logfile = logf
        self.logger_name = logger_name if logger_name else logf
        self.logger = self.get_logger(rotation=rotation) if rotation else self.get_logger()
        self.debug = debug if debug else False
        self.debug = debug if debug else LOG["debug"]

    def logf(self, filename=None):
        if filename is None:
            filename = LOG["file"]
        return "%s%s" % (LOG["dir"], filename)

    def get_logger(self, rotation=False):
        logger = logging.getLogger(self.logger_name)
        logf = self.logf(self.logfile)
        if rotation:
            from logging.handlers import TimedRotatingFileHandler
            self.handler = TimedRotatingFileHandler(logf, when='midnight', interval=1, backupCount=10)
        else:
            self.handler = logging.FileHandler(logf)
        formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
        #formatter = "%(asctime)s - %(levelname)s - %(filename)s:%(funcName)s - %(message)s",
        self.handler.setFormatter(formatter)
        logger.addHandler(self.handler)
        logger.setLevel(logging.DEBUG)
        return logger