0

A 有一个脚本可以在 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)
4

2 回答 2

2

撇开您的算法完全不正确的事实不谈,我将回答有关日志记录问题的问题。

相关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之后的下一个“参考时刻” 。
于 2015-06-01T09:53:49.000 回答
1

这可能会对您有所帮助(如果日志是在第 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)
于 2021-04-14T08:08:35.673 回答