2017-07-27 93 views
1

如何防止在這樣的應用程序中重複芹菜日誌?防止重複的芹菜記錄

# test.py 
from celery import Celery 

import logging 

app = Celery('tasks', broker='redis://localhost:6379/0') 
app.logger = logging.getLogger("new_logger") 
file_handler = logging.handlers.RotatingFileHandler("app.log", maxBytes=1024*1024, backupCount=1) 
file_handler.setFormatter(logging.Formatter('custom_format %(message)s')) 
app.logger.addHandler(file_handler) 

@app.task 
def foo(x, y): 
    app.logger.info("log info from foo") 

我開始與應用:celery -A test worker --loglevel=info --logfile celery.log

然後我會FOO與python -c "from test import foo; print foo.delay(4, 4)"

這將導致「日誌從富信息」顯示在兩個celery.logapp.log運行。

這裏是app.log內容:

custom_format log info from foo 

這裏是celery.log內容:

[2017-07-26 21:17:24,962: INFO/MainProcess] Connected to redis://localhost:6379/0 
[2017-07-26 21:17:24,967: INFO/MainProcess] mingle: searching for neighbors 
[2017-07-26 21:17:25,979: INFO/MainProcess] mingle: all alone 
[2017-07-26 21:17:25,991: INFO/MainProcess] [email protected] ready. 
[2017-07-26 21:17:38,224: INFO/MainProcess] Received task: test.foo[e2c5e6aa-0d2d-4a16-978c-388a5e3cf162] 
[2017-07-26 21:17:38,225: INFO/ForkPoolWorker-4] log info from foo 
[2017-07-26 21:17:38,226: INFO/ForkPoolWorker-4] Task test.foo[e2c5e6aa-0d2d-4a16-978c-388a5e3cf162] succeeded in 0.000783085000876s: None 

我認爲刪除從Python代碼自定義記錄器處理程序,但我不只想使用celery.log,因爲它不支持旋轉文件。我考慮用--logfile /dev/null開始芹菜,但是我會放鬆在app.log沒有出現的混合和其他日誌。

我可以阻止「foo的日誌信息」出現在celery.log?鑑於我從頭開始創建記錄器,並且只將日誌記錄設置爲app.log爲什麼「從foo記錄信息」出現在celery.log中?

是否可以通過RotatingFileHandler記錄芹菜MainProcess和工作人員日誌(例如Connected to redis://localhost:6379/0)(例如,去我的app.log)?

回答

2

爲什麼「日誌信息從foo」出現在celery.log中?

日誌系統基本上是在樹(你得到的呼叫logging.getLogger()不帶參數的根)的根logginig.Logger對象與主logging.Logger樹。

當您致電logging.getLogger("child")時,您可以參考處理「子」日誌的logging.Logger。問題在於,當您致電logging.getLogger("child").info()時,信息消息會傳遞給「孩子」,但也會傳遞給「孩子」的父母及其父母,直到它到達根。

爲避免發送日誌給父母,您必須設置logging.getLogger("child").propagate = False