首页 > 解决方案 > Python celery 日志记录轮换

问题描述

我有一个 celery 应用程序,它执行并发 = 1 的任务。我使用以下代码添加了日志,它工作正常但是当它尝试旋转日志时我面临异常,

下面是我的代码,

app = Celery('src.tasks',
             broker='amqp://user:pass@server:5672//',
             )

app.config_from_object('src.settings')

# Optional configuration, see the application user guide.
app.conf.update(
    CELERY_ACKS_LATE=True,
    CELERY_PREFETCH_MULTIPLIER=1,
    CELERYBEAT_MAX_LOOP_INTERVAL=600,
    CELERY_ROUTES={'myqueue': {'queue': 'myqueue'}},
    CELERY_TASK_SERIALIZER='pickle',
    CELERY_RESULT_SERIALIZER='pickle',
    CELERY_ACCEPT_CONTENT=['pickle', 'json'],
    result_expires=3600,
)


LOGGER = app.conf.LOGGER

我的设置是,

LOG_FILENAME="log.log"
LOGGER = logging.getLogger(__name__)
LOGGER.setLevel(logging.DEBUG)
handler = logging.handlers.TimedRotatingFileHandler(LOG_FILENAME,
                                               maxBytes=100,
                                               backupCount=5,
                                             )
formatter = logging.Formatter(LOG_FORMAT)
handler.setFormatter(formatter)
LOGGER.addHandler(handler)

我正在执行如下代码

>> celery -A src.tasks worker -E -Q AWS_jobclassification --concurrency=1

错误

[2020-12-18 06:40:01,305: WARNING/Worker-1] File "d:\install\miniconda\envs\py27\lib\logging\handlers.py", line 350, in doRollover
[2020-12-18 06:40:01,305: WARNING/Worker-1] os.rename(self.baseFilename, dfn)
[2020-12-18 06:40:01,305: WARNING/Worker-1] WindowsError: [Error 32] The process cannot access the file because it is being used by another process
[2020-12-18 06:40:01,305: WARNING/Worker-1] Logged from file tasks.py, line 183

我的代码有什么问题?以及如何在芹菜任务中使用日志轮换?谢谢你。

我正在使用 Windows 服务器

标签: pythonloggingcelery

解决方案


我对芹菜一无所知。但是,据我所知,您正在使用该logging模块,该模块不支持开箱即用的多处理。这是解释here

从该答案中,每个进程都有一个文件句柄,因此当其中一个进程尝试修改文件(更改其名称以轮换日志)时,您将收到该错误(其他进程仍打开文件句柄)。

查看您在代码中的哪个位置使用LOGGER. 另外,从文档中,我看到 Celery 提供了一个日志记录配置,(至少从帖子中的代码来看)看起来你没有使用它。也许该配置有助于解决您遇到的并发问题。


推荐阅读