![](/img/trans.png)
[英]Creating .log files with logging's TimedRotatingFileHandler
[英]logging.handler.TimedRotatingFileHandler never rotates the log
有一個腳本可以在 linux 服務器(CentOS 6)上同步時間並在日志中寫入偏移量。 我想在 10 天后將當前日志 (ntp.log) 復制到舊日志 (ntp.log-date),但這不起作用。 該腳本繼續寫入一個文件而不是旋轉。 它由 cron 每 5 分鍾運行一次。 我使用的是 python 2.6 版。 我專門設置了以秒為單位的間隔來檢查。 我究竟做錯了什么?
#!/usr/bin/env python
import ntplib
import logging
from logging.handlers import TimedRotatingFileHandler
from time import ctime
import os
import socket
hostname = socket.gethostname()
logHandler = TimedRotatingFileHandler('/root/ntp/log/ntp.log', when='S', interval=300)
logFormatter = logging.Formatter('%(asctime)s %(message)s', datefmt='%d/%m/%Y %H:%M:%S')
logHandler.setFormatter(logFormatter)
logger = logging.getLogger('MyLogger')
logger.addHandler(logHandler)
logger.setLevel(logging.INFO)
c = ntplib.NTPClient()
response = c.request('1.rhel.pool.ntp.org')
logger.info('| %s time offset is | %s' % (hostname, response.offset))
datestr = ctime(response.tx_time)
os.system('date -s "%s"' % datestr)
撇開你的算法完全不正確的事實,我將回答有關日志記錄問題的問題。
這是相關的logging.handlers.TimedRotatingFileHandler
邏輯:
def __init__(<...>):
<...>
if self.when == 'S':
self.interval = 1 # one second
<...>
self.interval = self.interval * interval # multiply by units requested
<...>
if os.path.exists(filename):
t = os.stat(filename)[ST_MTIME]
else:
t = int(time.time())
self.rolloverAt = self.computeRollover(t)
def computeRollover(self, currentTime):
result = currentTime + self.interval
<special logic that doesn't apply in your case>
return result
因此, 'S'
模式下的翻轉時間是根據腳本初始化時文件的mtime計算的。 每次寫入文件時都會修改mtime 。
因此,只有在腳本啟動后interval
秒后登錄時才會進行翻轉。 情況並非如此,因為它的運行時間要少得多。
可能的修復:
TimedRotatingFileHandler.computeRollover()
的“特殊邏輯”僅適用於'MIDNIGHT'
和'Wn'
情況),因此您需要替換處理程序的computeRollover()
這可能對您有所幫助(如果日志是以第 10 天的倍數創建並且日志上次修改是前一天,則滾動日志)
#!/usr/bin/env python
import ntplib
import logging
from logging.handlers import TimedRotatingFileHandler
from time import ctime
import os
import socket
hostname = socket.gethostname()
logHandler = TimedRotatingFileHandler('/root/ntp/log/ntp.log', when='D', interval=10)
logFormatter = logging.Formatter('%(asctime)s %(message)s', datefmt='%d/%m/%Y %H:%M:%S')
logHandler.setFormatter(logFormatter)
#Get File creation Time
log_ctime = datetime.fromtimestamp(os.path.getctime("/root/ntp/log/ntp.log")).date()
log_mtime = datetime.fromtimestamp(os.path.getmtime("/root/ntp/log/ntp.log")).date()
delta_c = datetime.now().date() - log_ctime
delta_m = datetime.now().date() - log_mtime
if delta_c.days %10 == 0 and delta_m.days>=1:
logHandler.doRollover()
logger = logging.getLogger('MyLogger')
logger.addHandler(logHandler)
logger.setLevel(logging.INFO)
c = ntplib.NTPClient()
response = c.request('1.rhel.pool.ntp.org')
logger.info('| %s time offset is | %s' % (hostname, response.offset))
datestr = ctime(response.tx_time)
os.system('date -s "%s"' % datestr)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.