当前位置: 首页 > 面试题库 >

检测日志文件旋转(在监视日志文件进行修改的同时)

姚建树
2023-03-14
问题内容

我使用以下代码跟踪ssh登录:

def follow(thefile):
  thefile.seek(0,2)
  while True:
    line = thefile.readline()
    if not line:
      time.sleep(0.1)
      continue
    yield line

if __name__ == '__main__':
  logfile = open('/var/log/auth.log', 'r')
  loglines = follow(logfile)
  for line in loglines:
    print 'do something here'

我注意到该脚本在几天后突然停止工作。我没有任何错误,它不会终止,只会停止工作,好像readline()永远不会返回。

所以我执行了a echo 'test' >> auth.log.1,这的确最终被脚本处理了,因为前一段时间auth.log将其重命名为auth.log.1

如何跟踪这种日志轮换的时间并进行相应调整?


问题答案:

使用e4c5的答案,我得到了这段代码,该代码还解决了readline()每秒调用多次的问题。

在第一次调用期间,它会跳到文件末尾并等待修改。移动文件后,它将重新打开文件并读取全部内容,然后开始等待。

import os
import time
import traceback
import threading
import inotify.adapters

logfile = b'/var/log/auth.log'
#logfile = b'logfile.log'

##################################################################

def process(line, history=False):
  if history:
    print '=', line.strip('\n')
  else:
    print '>', line.strip('\n')

##################################################################

from_beginning = False
notifier = inotify.adapters.Inotify()
while True:
  try:
    #------------------------- check
    if not os.path.exists(logfile):
      print 'logfile does not exist'
      time.sleep(1)
      continue
    print 'opening and starting to watch', logfile
    #------------------------- open
    file = open(logfile, 'r')
    if from_beginning:
      for line in file.readlines():
        process(line, history=True)
    else:
      file.seek(0,2)
      from_beginning = True
    #------------------------- watch
    notifier.add_watch(logfile)
    try:
      for event in notifier.event_gen():
        if event is not None:
          (header, type_names, watch_path, filename) = event
          if set(type_names) & set(['IN_MOVE_SELF']): # moved
            print 'logfile moved'
            notifier.remove_watch(logfile)
            file.close()
            time.sleep(1)
            break
          elif set(type_names) & set(['IN_MODIFY']): # modified
            for line in file.readlines():
              process(line, history=False)
    except (KeyboardInterrupt, SystemExit):
      raise
    except:
      notifier.remove_watch(logfile)
      file.close()
      time.sleep(1)
    #-------------------------
  except (KeyboardInterrupt, SystemExit):
    break
  except inotify.calls.InotifyError:
    time.sleep(1)
  except IOError:
    time.sleep(1)
  except:
    traceback.print_exc()
    time.sleep(1)

##################################################################


 类似资料:
  • 要有效地管理Web服务器,就有必要反馈服务器的活动、性能以及出现的问题。Apache HTTP服务器提供了非常全面而灵活的日志记录功能。本文将阐述如何配置文件以及如何理解日志内容。 安全警告 任何人只要对Apache存放日志文件的目录具有写权限,也就当然地可以获得启动Apache的用户(通常是root)的权限,绝对不要随意给予任何人存放日志文件目录的写权限。细节请参见安全方面的提示。 另外,日志文

  • Navicat 提供数个日志文件记录在 Navicat 已运行的动作,它们在子目录 logs,例如: C:\Users\Guest\Documents\Navicat\Premium\logs\。你可以在选项中改变日志文件的位置。 HttpDump.log 保存从你的 HTTP 服务器答复的数据。 LogHistory.txt 记录在 Navicat 数据库及数据库对象上全部已运行的作业上的全部

  • Navicat Monitor 日志文件具有各种服务器错误和信息的详细记录。这些文件可以帮助跟踪 Navicat Monitor 的任何问题。请按照以下步骤下载日志文件: 前往“ 配置”。 点击“关于”。 滚动到“诊断”部分。 点击“检索全部日志文件”以下载包含日志文件的一份 .zip 文件。

  • Navicat 提供数个日志文件记录在 Navicat 已执行的操作,它们位于“logs”目录,例如:C:\Users\Guest\Documents\Navicat\Premium\logs\。你可以在选项中更改日志文件的位置。 文件 描述 history.log 保存在 Navicat 数据库和数据库对象上所有已运行的操作的所有语句或脚本。若要在“历史日志查看器”打开 history.log

  • Navicat 提供数个日志文件记录在 Navicat 已执行的操作,它们位于默认文件夹,例如:~/Library/Application Support/PremiumSoft CyberTech/Navicat CC/Navicat Premium/Logs。你可以在偏好设置中更改日志文件的位置。 文件 描述 QueryExec.log 保存在 Navicat 数据库和数据库对象上所有已运行的

  • 日志路径 指定保存日志文件的路径。 写入已运行的查询的日志 保存在 Navicat 数据库和数据库对象上所有已运行的操作的所有 SQL 语句。 【提示】需要重新启动 Navicat 才生效。 写入批处理作业日志(仅适用于非 Essentials 版) 保存 Navicat 命令列进程和运行批处理作业时所有操作的信息。