的醫生說我可以在Celery任務中使用泛型logging.Logger()嗎?
一個特殊的記錄器可命名爲「celery.task」,你可以從這個記錄器繼承來自動獲取任務名稱和唯一ID作爲日誌的一部分。
這是不夠的。有更詳細的信息嗎?具體來說,它默認定義了哪些處理程序和格式化字符串?我爲什麼要從它繼承?我可以使用通用logging.Logger()
嗎?從芹菜任務(而不是Django)登錄文件的最佳做法是什麼?等謝謝。
的醫生說我可以在Celery任務中使用泛型logging.Logger()嗎?
一個特殊的記錄器可命名爲「celery.task」,你可以從這個記錄器繼承來自動獲取任務名稱和唯一ID作爲日誌的一部分。
這是不夠的。有更詳細的信息嗎?具體來說,它默認定義了哪些處理程序和格式化字符串?我爲什麼要從它繼承?我可以使用通用logging.Logger()
嗎?從芹菜任務(而不是Django)登錄文件的最佳做法是什麼?等謝謝。
我可以使用泛型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
方法設置。
什麼是登錄到芹菜任務 (不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
非常感謝。儘管如此,我還有幾點不清楚。 1.「......獲得任務名稱......」 - 我如何以及在哪裏獲得它?例如,如果我想更改格式。 2.在最後一節(最佳實踐)中,您不使用芹菜記錄器。它是首選嗎?謝謝 – davka