2017-06-05 69 views
4

的醫生說我可以在Celery任務中使用泛型logging.Logger()嗎?

一個特殊的記錄器可命名爲「celery.task」,你可以從這個記錄器繼承來自動獲取任務名稱和唯一ID作爲日誌的一部分。

這是不夠的。有更詳細的信息嗎?具體來說,它默認定義了哪些處理程序和格式化字符串?我爲什麼要從它繼承?我可以使用通用logging.Logger()嗎?從芹菜任務(而不是Django)登錄文件的最佳做法是什麼?等謝謝。

回答

1

我可以使用泛型logging.Logger()而不是

是的,你可以使用通用的Python/Django記錄器。 而不是logger = get_task_logger(__name__)只要選擇getLogger

import logging 
logger = logging.getLogger(__name__) 

爲什麼我要繼承它?

使用celery.task的優點是:

自動獲得任務名稱和唯一ID作爲日誌的一部分。

它本身使用標準的Python logging lib。


這很難說是足夠的。有更詳細的信息嗎? 具體來說,它默認定義了哪些處理程序和格式化字符串?

默認情況下,它的使用WatchedFileHandlerlogging.handlers 您可以celery.app.log文檔中檢查,這是越來越在setup_handler方法設置。


什麼是登錄到芹菜任務 (不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 
+0

非常感謝。儘管如此,我還有幾點不清楚。 1.「......獲得任務名稱......」 - 我如何以及在哪裏獲得它?例如,如果我想更改格式。 2.在最後一節(最佳實踐)中,您不使用芹菜記錄器。它是首選嗎?謝謝 – davka

相關問題