2015-06-01 85 views
0

有一個腳本可以在Linux服務器上同步時間(CentOS 6)並在日誌中寫入偏移量。我想在10天后將當前日誌(ntp.log)複製到舊的(ntp.log-date),但這不起作用。腳本繼續寫入一個文件而不旋轉。它每5分鐘運行一次cron。我使用python版本2.6。我特別設置了以秒爲單位的間隔來檢查。我究竟做錯了什麼?logging.handler.TimedRotatingFileHandler從不旋轉日誌

#!/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) 
+2

我強烈建議您使用'ntpd'和'logrotate',而不是另起爐竈。 'ntpd'的邏輯比周期性的一次性「同步」更健全。 –

+0

關於'logrotate'必須看到,我不能使用'ntpd',我需要同步'日誌 – reddaemon

+0

'ntpd'比「同步」更聰明,它使用「內核時間規則」API並且被設計爲實際*讓你一勞永逸地忘記同步的東西*(http://www.eecis.udel.edu/~mills/ntp/html/discipline.html#house:「如果連續運行,一個NTP客戶端家庭或辦公室環境中的快速LAN可以在1毫秒內保持名義上的同步。「)不用擔心,它會在系統時鐘執行任何操作時記錄下它。 –

回答

1

離開外面的事實你的算法是明顯不正確的,我會回答關於日誌問題的問題。

下面是相關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在腳本的init的時間來計算。 mtime在您每次寫入文件時都會被修改。

因此,翻轉只能在腳本啓動後的interval秒之後登錄。因爲它運行得少得多,所以永遠不會有這種情況。

可能的修正:

  • 使腳本運行這麼長時間,例如如你所建議的那樣有一個無限循環。如果是無限期運行,它可能應該由一個守護進程
  • 變化的翻轉力矩計算算法
    • 這是不可能隨着股市的邏輯(「特殊邏輯」在TimedRotatingFileHandler.computeRollover()僅適用於'MIDNIGHT''Wn'案件) ,所以您需要更換您的處理程序的computeRollover()
    • 基本上,您需要將當前文件的mtime後的翻轉時間設置爲下一個「參考時刻」。
+0

請告訴我需要改變算法的工作,就像我需要的一樣? – reddaemon

+0

[NTP的工作原理](http://www.eecis.udel.edu/~mills/ntp/html/warp.html) –

+0

也許我必須運行它不是通過cron,並使無限循環。或者我只是必須增加間隔? – reddaemon