簡體   English   中英

logging.handler.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()
    • 基本上,您需要將翻轉時間設置為當前文件的mtime之后的下一個“參考時刻”。

這可能對您有所幫助(如果日志是以第 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM