I wrote a small viewer app in Python for elogs. It uses PyGTK. (This is my first Python program, so it might not be the "right way" to code in Python, but it works at a basic level.)
I've been meaning to add things like a "delete" button, but I haven't gotten around to it. Feel free to hack onto it.
Code: Select all
#!/usr/bin/env python
import pygtk
pygtk.require( '2.0' )
import gtk, gobject
import sys, os
from UserDict import UserDict
import re, time
class elogEntry:
def __init__(self, logClass, stage):
self.logClass = logClass
self.stage = stage
self.log = []
def addLine(self, logLine):
self.log.append(logLine)
inputTimeFormat = "%Y%m%d-%H%M%S.log"
def stripNl( line ):
return re.match( r'^([^\\\n]*)', line ).group( 1 )
class elog:
def __init__(self, file):
(self.category, self.package, timestamp) = file.name.split( ":" )
self.timestamp = time.strptime( timestamp, inputTimeFormat )
self.__parseElogs( file.readlines() )
def __parseElogs(self, lines ):
self.elogs = []
lastNL = False
header = False
headerPattern = re.compile('^(INFO|WARN|ERROR|LOG)')
for line in lines:
if headerPattern.match( line ):
ls = line.split( ": " )
currentEntry = elogEntry( ls[0], stripNl( ls[1] ) )
lastNl = False
header = True
elif line == '\n':
if not lastNl and not header:
self.elogs.append( currentEntry )
lastNl = True
else:
currentEntry.addLine( stripNl( line ) )
lastNl = False
header = False
def getTimestamp(self, timeFormat):
return time.strftime( timeFormat, self.timestamp )
class eLogViewer:
def create_list(self):
scrolled_window = gtk.ScrolledWindow()
scrolled_window.set_policy( gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC )
model = gtk.ListStore( str, str, str, gobject.TYPE_PYOBJECT )
self.tree_view = gtk.TreeView( model )
selection = self.tree_view.get_selection()
selection.set_mode( gtk.SELECTION_SINGLE )
selection.connect_object( "changed", self.insert_text, None )
scrolled_window.add( self.tree_view )
self.tree_view.show()
timeFormat = "%m-%d-%Y %H:%M:%S"
for i in self.elogs:
model.append( [i.category, i.package, i.getTimestamp( timeFormat ), i] )
model.set_sort_column_id( 2, gtk.SORT_DESCENDING )
col_headers = [ "Category", "Package", "Timestamp" ]
for i in range(0,3):
cell = gtk.CellRendererText()
column = gtk.TreeViewColumn( col_headers[i], cell, text=i )
column.set_sort_column_id( i )
self.tree_view.append_column( column )
return scrolled_window
def insert_text(self, data=None):
buffer = self.view.get_buffer()
buffer.set_text('')
iter = buffer.get_start_iter()
(model, liter) = self.tree_view.get_selection().get_selected()
if liter is None:
selected = self.elogs[1]
else:
selected = model.get_value( liter, 3 )
for log in selected.elogs:
buffer.insert( iter, "%s (%s):\n" % (log.logClass, log.stage) )
for line in log.log:
buffer.insert( iter, "%s\n" % line )
buffer.insert( iter, "\n" )
def create_text(self):
self.view = gtk.TextView()
self.view.set_editable( False )
self.view.set_cursor_visible( False )
scrolled_window = gtk.ScrolledWindow()
scrolled_window.set_policy( gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC )
scrolled_window.add( self.view )
#self.insert_text()
scrolled_window.show_all()
return scrolled_window
def __init__(self):
self.elogs = []
for f in os.listdir("/var/tmp/elogs/"):
try:
fileName = "/var/tmp/elogs/" + str(f)
file = open( fileName )
self.elogs.append( elog( file ) )
file.close
except:
print "Error opening %s" % fileName
window = gtk.Window( gtk.WINDOW_TOPLEVEL )
window.set_title( "elog Viewer" )
window.connect( "destroy", lambda w: gtk.main_quit() )
window.set_border_width( 10 )
window.set_size_request( 850, 600 )
vpaned = gtk.VPaned()
window.add( vpaned )
vpaned.show()
list = self.create_list()
vpaned.add1( list )
list.show()
text = self.create_text()
vpaned.add2( text )
text.show()
vpaned.set_position( 250 )
window.show()
def main():
gtk.main()
return 0
if __name__ == "__main__":
eLogViewer()
main()