2015-02-05 4 views
1

У меня есть тестовый заглушка, который будет записывать несколько журнальных сообщений в системный журнал.python отслеживает файл журнала, не блокирующий

Но этот системный журнал также обновляется многими другими приложениями. Итак, в основном, я хочу сделать tail -f system.log | grep "application name", чтобы получить только соответствующие сообщения журнала.

Я смотрел на трюки генератор dbaez, и я пытаюсь совместить оба http://www.dabeaz.com/generators/follow.py и http://www.dabeaz.com/generators/apachelog.py

Итак, в моем __main__(), у меня есть что-то вроде этого:

try: 
    dosomeprocessing()  #outputs stuff to the log file 

И в dosomeprocessing (), Я запускаю цикл, и для каждого цикла я хочу посмотреть, есть ли какие-либо новые сообщения журнала, вызванные моим приложением, и не обязательно распечатывать их, но хранить их где-нибудь, чтобы выполнить некоторую проверку.

logfile = open("/var/adm/messages","r") 
    loglines = follow(logfile) 
    logpats = r'I2G(JV)' 
    logpat = re.compile(logpats) 
    groups = (logpat.match(line) for line in loglines) 
    for g in groups: 
     if g: 
      print g.groups() 

Журнал выглядит примерно так:

Feb 4 12:55:27 Someprocessname.py I2G(JV)-300[20448]: [ID 702911 local2.error] [MSG-70047] xxxxxxxxxxxxxxxxxxxxxxx 
Feb 4 12:55:27 Someprocessname.py I2G(JV)-300[20448]: [ID 702911 local2.error] [MSG-70055] xxxxxxxxxxxxxxxxxxxxxxx 

в дополнение к множеству других gobblygook.

Прямо сейчас, она застревает в для г в группах:

Я относительно новым для питона и асинхронного программирования. В идеале я хотел бы иметь хвост, идущий параллельно основному процессу, и читать новые данные с каждым циклом.

Пожалуйста, дайте мне знать, если мне нужно добавить дополнительную информацию.

+0

ли вращать лог-файл? Ваш 'follow.py' не обрабатывает регистратор, который переименовывает« сообщения », например,« messages.1 », а затем создает новый файл для дополнительных журналов. – tdelaney

+0

Он почти никогда не вращается, имя файла остается неизменным. – roymustang86

ответ

4

Предлагаю вам использовать либо watchdog, либо pyinotify для мониторинга изменений в вашем файле журнала.

Кроме того, я бы посоветовал запомнить последнюю позицию, о которой вы читаете. После того, как вы получите уведомление IN_MODIFY, вы можете прочитать последнюю позицию до конца файла и снова применить свой цикл. Кроме того, сбросить последнюю позицию до 0, когда она больше размера файла в случае, если файл был усечен.

Вот пример:

import pyinotify 
import re 
import os 


wm = pyinotify.WatchManager() 
mask = pyinotify.IN_MODIFY 


class EventHandler (pyinotify.ProcessEvent): 

    def __init__(self, file_path, *args, **kwargs): 
     super(EventHandler, self).__init__(*args, **kwargs) 
     self.file_path = file_path 
     self._last_position = 0 
     logpats = r'I2G\(JV\)' 
     self._logpat = re.compile(logpats) 

    def process_IN_MODIFY(self, event): 
     print "File changed: ", event.pathname 
     if self._last_position > os.path.getsize(self.file_path): 
      self._last_position = 0 
     with open(self.file_path) as f: 
      f.seek(self._last_position) 
      loglines = f.readlines() 
      self._last_position = f.tell() 
      groups = (self._logpat.search(line.strip()) for line in loglines) 
      for g in groups: 
       if g: 
        print g.string 


handler = EventHandler('some_log.log') 
notifier = pyinotify.Notifier(wm, handler) 

wm.add_watch(handler.file_path, mask)   
notifier.loop() 
+0

Я не использовал pyinotify, но вместо этого использовал файлы read, методы поиска файлов, которые вы определили выше, чтобы сделать это. Благодаря! – roymustang86