次のコードでは、 で予期しない動作が発生しlogging.handlers.TimedRotatingFileHandler
ます。
logger1 = logging.getLogger("One")
logger2 = logging.getLogger("Two")
handler1 = TimedRotatingFileHandler(
"service.log",
when="M",
backupCount=2,
utc=True
)
handler2 = TimedRotatingFileHandler(
"service.log",
when="M",
backupCount=2,
utc=True
)
formatter = logging.Formatter("%(asctime)s - %(name)s - %(message)s")
handler1.setFormatter(formatter)
handler2.setFormatter(formatter)
logger1.addHandler(handler1)
logger2.addHandler(handler2)
while True:
sleep(0.5)
logger1.error("ONE")
logger2.error("TWO")
数分間実行したままにすると、最初の実行の終わりにすべてが正常に表示されます。ファイルが期待どおりの瞬間にロールオーバーしないという、ある種のオフバイワン動作があることは承知していますが、これで問題ありません。
-rw-rw-r-- 1 dave dave 3.8K Sep 24 16:11 service.log
-rw-rw-r-- 1 dave dave 3.8K Sep 24 16:11 service.log.2019-09-24_09-09
-rw-rw-r-- 1 dave dave 4.3K Sep 24 16:10 service.log.2019-09-24_09-08
ただし、既存の service.log* ファイルを削除せずに同じディレクトリでスクリプトを再度開始する前に数分待つと、書き込みlogger1
が開始され、期待どおりに書き込まれるようになりました。next toの最終更新時刻に注意してください。service.log.2019-09-24_09-11
logger2
service.log
16:17
service.log.2019-09-24_09-11
-rw-rw-r-- 1 dave dave 540 Sep 24 16:17 service.log
-rw-rw-r-- 1 dave dave 540 Sep 24 16:17 service.log.2019-09-24_09-11
-rw-rw-r-- 1 dave dave 3.8K Sep 24 16:11 service.log.2019-09-24_09-09
スクリプトが再起動されたときの最初のエントリだけではありませlogger1
ん。logger.error
dave:~$ cat service.log.2019-09-24_09-11
2019-09-24 16:16:55,390 - One - ONE
2019-09-24 16:16:55,892 - One - ONE
2019-09-24 16:16:56,393 - One - ONE
2019-09-24 16:16:56,894 - One - ONE
2019-09-24 16:16:57,395 - One - ONE
2019-09-24 16:16:57,896 - One - ONE
2019-09-24 16:16:58,397 - One - ONE
2019-09-24 16:16:58,898 - One - ONE
...
Python 3.7.4 を使用しています。
編集:数分間ログが書き込まれない場合、スクリプトを停止および開始せずに警告動作を再現できます。
sleep(180)
置換中のログ ファイルの状態を観察します (それぞれのサイズが 36 バイトまでパージされます!)。
while True:
sleep(0.5)
logger1.error("ONE")
logger2.error("TWO")
...と...
for _ in range(60):
sleep(1)
logger1.error("ONE")
logger2.error("TWO")
sleep(180) # blocking, no logs written but log files are in eroded state
for _ in range(60):
sleep(1)
logger1.error("ONE")
logger2.error("TWO")