2017-09-18 3 views
0

私はでログファイルを作成したいフラスコ、Pythonの3.xおよびcelery4 (合計8人の労働者)のPython-セロリログイン

を使用する「RotatingFileHandler」ファイルサイズを超えている場合は分割します。

最初のログファイルで正常に動作します。 (それは、すべての労働者にはログインが含まPoolWorker-1〜PoolWorker-8)

-rw-rw-r-- 1 sj sj 1048530 9월 18 10:01 celery_20170918.log (All worker's log) 

しかし、ファイルサイズが終わったとき、区切りファイル上の労働者の書き込みログ。

-rw-rw-r-- 1 sj sj 223125 9월 18 10:47 celery_20170918.log (All worker's log except below 2, 5, 6)) 
-rw-rw-r-- 1 sj sj  43785 9월 18 10:47 celery_20170918.log.1 (only PoolWorker-2 log) 
-rw-rw-r-- 1 sj sj  46095 9월 18 10:47 celery_20170918.log.2 (only PoolWorker-5 log) 
-rw-rw-r-- 1 sj sj  45990 9월 18 10:47 celery_20170918.log.3 (only PoolWorker-6 log) 
-rw-rw-r-- 1 sj sj 1048530 9월 18 10:01 celery_20170918.log.4 (Log file made at first is changed to this.) 

ルールは何か分かりませんし、重複したログがあります。

私のセロリのロガーは以下の通りです。

tasks.py

logger = get_task_logger('tasks') 
logger.setLevel("INFO") 
filename = './log/celery/celery_task.log' 
formatter = Formatter('%(levelname)s-%(asctime)s %(processName)s %(funcName)s():%(lineno)d %(message)s') 
# FileSize rotating 
fileMaxByte = 1024 * 1024 * 1 # 30MB 
fileHandler = logging.handlers.RotatingFileHandler(filename, maxBytes=fileMaxByte, backupCount=100) 
fileHandler.setFormatter(formatter) 
logger.addHandler(fileHandler) 

@celery.task(...options...) 
def test_call(self): 
    logger.info("LOG TEST") 

test.pyは、何が問題になっています

if __name__ == '__main__': 
    test_call.apply_async() 

答えて

0

RotatingFileHandlerログファイルのロールオーバー時にマルチプロセス間のアトミック性を維持しません。マルチプロセス環境で

、プロセスAは、ファイルが新しくc.logを作成するためにいくつかのログの行を記述し、その後、c.log.1に名前を変更しない、ログファイルc.logmaxBytesに達し参照してください。

しかしthe way used to check file sizeは、ファイルハンドルの終了オフセットに基づいており、それはまたmaxBytesに達し見ているので、同時に、別のプロセスBは、まだ、c.logのハンドルを持って、自分自身でファイルのロールオーバーやりたいです、 the way used to roll overがディスク上のファイルの名前を変更するため、このプロセスでc.logからc.log.1に名前を変更しようとしますが、c.log.1が存在するため、c.log.2に名前が変更されます。

他のプロセスがあるので、c.log.3などが作成されます。

この問題は、外部ロギングメカニズムを使用して解決するか、アトミックファイル回転ロギングハンドラをラップアップすることができます。

+0

ありがとうございました!素敵な答え:)私は自分の回転ロガーを作ろうとします。ありがとう! – hai

+0

'外部ロギングメカニズム'の例は、この回答に大きな助けになります。 – KBoehme

+0

@KBoehmeそれは非常にコンテキストに依存しますが、(r)syslogd/systemdを使うことができます。 – georgexsh