所以 Celery 是一个超级棒的库,但它的日志记录部分的文档并不是最好的,这让我来这里请求帮助。
到目前为止,我的脚本是这样的(总结得很好(:
import logging
from celery import Celery
from celery.utils.log import get_logger
from task import process
import config
logger = get_logger(__name__)
timber_handler = timber.TimberHandler(api_key=config.key,
level=logging.INFO)
logger.addHandler(timber_handler)
app = Celery('task',
broker=config.url,
backend='rpc://')
@app.task
def run_task():
status = get_status() # get alive or dead status
if status == 1:
logger.info("Task is running")
process()
@app.on_after_configure.connect
def task_periodic(**kwargs):
app.add_periodic_task(2.0, run_task.s(), name="Run Constantly")
# More tasks
tasks.py 文件中的进程函数是非常基本的函数,可以调用API和数据库以获取某些信息,我希望能够将其记录到记录器(timber.io(,该记录器附加到python日志记录库并且是日志的在线存储。
但是,我的主要问题是原木被发送到标准输出而不是木材原木。我看过芹菜信号,但文档不是很好。这里的任何帮助将不胜感激。谢谢。
你能试试这个吗?
import logging
import os
import sys
from celery import Celery
from celery.signals import after_setup_logger
app = Celery('app')
app.conf.update({
'broker_url': 'filesystem://',
'broker_transport_options': {
'data_folder_in': './broker/out',
'data_folder_out': './broker/out',
'data_folder_processed': './broker/processed'
},
'result_persistent': False,
'task_serializer': 'json',
'result_serializer': 'json',
'accept_content': ['json']})
logger = logging.getLogger(__name__)
for f in ['./broker/out', './broker/processed']:
if not os.path.exists(f):
os.makedirs(f)
@after_setup_logger.connect
def setup_loggers(logger, *args, **kwargs):
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
# add filehandler
fh = logging.FileHandler('logs.log')
fh.setLevel(logging.DEBUG)
fh.setFormatter(formatter)
logger.addHandler(fh)
@app.task()
def add(x, y):
logger.info('Found addition')
logger.info('Added {0} and {1} to result, '.format(x,y))
return x+y
if __name__ == '__main__':
task = add.s(x=2, y=3).delay()
像这样启动工作线程:
celery worker --app=app.app --concurrency=1 --loglevel=INFO
并异步启动任务:
python app.py
我已经更改了它,因此它是一个独立的脚本,仅将文件系统用作消息代理(此外,我特意将 timber.io 处理程序替换为文件处理程序(。
这会将日志写入logs.log
(将文件处理程序替换为 timber.io 处理程序,这应该可以解决您的问题(。
我遇到了一些困难,因为我无法让它与worker_hijack_root_logger=False
和setup_logging
中定义的自定义记录器一起工作。
但是,在重新访问文档后,我得出的结论是,不覆盖记录器而只是增强它是一个更好的选择:
如果您想通过 Celery 增强日志记录配置设置 然后您可以使用after_setup_logger和after_setup_task_logger 信号。
另请参阅:http://docs.celeryproject.org/en/latest/userguide/signals.html#after-setup-logger