2017-06-05 19 views
4

ドキュメントは、特別なロガーが「celery.task」という名前の利用可能である、あなたは自動的にログの一部として、タスク名と一意のIDを取得するには、このロガーから継承することができますCeleryタスクで一般的なlogging.Logger()を使用できますか?

言います。

これではほとんどありません。より詳しい情報がありますか?具体的には、デフォルトでどのハンドラと書式文字列が定義されていますか?なぜにはを継承したいのですか?代わりにlogging.Logger()という一般名を使用できますか?セロリタスク(Djangoではない)からファイルにログを記録するためのベストプラクティスは何ですか?などありがとうございます。

答えて

1

genericlog.Logger()を代わりに使用できますか?

はい、一般的なPython/Djangoロガーを使用できます。 代わりのlogger = get_task_logger(__name__)だけgetLoggerを選択します。

import logging 
logger = logging.getLogger(__name__) 

私はそれを継承したいと思うのはなぜ?

celery.taskを使用する利点は次のとおりです。

自動的にログの一部として、タスク名と一意のIDを取得します。

それ自体は標準のPython logging libを使用しています。


これはほとんど十分です。より詳しい情報がありますか? 特に、デフォルトで定義されているハンドラと書式文字列は何ですか?デフォルトでは

あなたはそれがsetup_handler方法で設定したばかりだ、celery.app.log文書で確認することができますlogging.handlers からWatchedFileHandlerを使用しています。


セロリタスク (ないジャンゴ)からファイルへのロギングのためのベストプラクティスは何ですか?などのモジュールで直接

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を使用してください。 *.ini - 個別のログ形式のファイル使用

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:

[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.別のクラス - なく、少なくとも最後には、よりエレガントな解決策は、このすべてを持っていることです別のモジュール(クラス)として使用し、特定のフラグを指定してインポートしてください:

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

関連する問題