Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2351289
  • 博文数量: 321
  • 博客积分: 3440
  • 博客等级: 中校
  • 技术积分: 2992
  • 用 户 组: 普通用户
  • 注册时间: 2007-05-24 09:08
个人简介

我就在这里

文章分类

全部博文(321)

文章存档

2015年(9)

2014年(84)

2013年(101)

2012年(25)

2011年(29)

2010年(21)

2009年(6)

2008年(23)

2007年(23)

分类: Python/Ruby

2013-02-17 21:39:42

在查看Jboss日志时,文件大了的话不好操作,所以自己用Python写了一个查看Jboss日志的工具,对工作还是有点帮助的

# -*- encoding:GBK -*-
"""
author:xieguozhong
email:superxgz@gmail.com

修订历史:
V0.3 2009-04-30
1 修改为实时跟踪日志
2 将原来的按钮修正为"启动,暂停,复制,清除"

V0.2 2009-03-13
1 增加了初始化文件时就定位到日志结尾,无须再点"Clear"按钮
2 增加了复制按钮
3 增加了最小化按钮
4 增加了日志显示框的横拉条,并使显示框为只读
5 增加了JBOSS路径的保存功能,可以删除和增加

V0.1 不记得了

"""
import wx
import os
import time
import threading
from wx.lib.wordwrap import wordwrap
import wx.lib.buttons as buttons
import wx.richtext as rt
import sqlite3

class LogViewFrame(wx.Frame):

    objFile = None
    filename = "logview.conf"
    currentState = 0    # 0表示停止状态 1表示监视状态
    def __init__(self):
        wx.Frame.__init__(self, 
                          parent=None, 
                          id=-1, 
                          title="Jboss日志查看器 V0.3", 
                          pos=wx.DefaultPosition,
                          size=(800,600),
                          style=wx.DEFAULT_FRAME_STYLE^(wx.RESIZE_BORDER |wx.MAXIMIZE_BOX),
                          name="mainFrame"
                          )
        #创建画板对象
        panel = wx.Panel(self)

        wx.StaticText(panel, -1,
                      "Jboss目录",
                      pos=(10,5)
                      )
        logList = self.controlConf("r","")
        self.tcJbossLogPath = wx.ComboBox(panel, -1, "", pos=(70,2), size=(350,25), choices=logList, style=wx.CB_DROPDOWN)
        
        #创建一个用于选择Jboss日志目录的按钮
        self.btGetJbossLogPath = wx.Button(panel, label="...", pos=(420, 2), size=(20, 25))
        
        #增加保存JBOSS地址按钮
        self.btSavePath = wx.Button(panel, label="+", pos=(440, 2), size=(20, 25))
        
        #增加删除JBOSS地址按钮
        self.btDelPath = wx.Button(panel, label="-", pos=(460, 2), size=(20, 25))
        
        #创建开始按钮
        self.btStart = buttons.GenButton(panel, label="▲start", pos=(490, 2), size=(70, 25))
        self.btStart.SetForegroundColour("green")
        
        #创建暂停按钮
        self.btPause = buttons.GenButton(panel, label="〓pause", pos=(560, 2), size=(70, 25))
        #btStart.SetForegroundColour("green")
        
        #创建复制按钮
        self.btCopy = wx.Button(panel, label="◎copy", pos=(630, 2), size=(70, 25))
        
        #创建清理按钮
        self.btClear = wx.Button(panel, label="□clear", pos=(700, 2), size=(70, 25))
        
        #创建显示日志框
        self.mtLogBox = wx.TextCtrl(panel, -1,"", pos=(2,28), size=(795, 540), style=wx.TE_MULTILINE|wx.HSCROLL|wx.TE_READONLY) 

                                
        #下面开始绑定按钮和事件的关联
        self.Bind(wx.EVT_BUTTON, self.OnGetJbossLogPath, self.btGetJbossLogPath)
        self.Bind(wx.EVT_BUTTON, self.OnCopy, self.btCopy)
        
        self.Bind(wx.EVT_BUTTON, self.OnStart, self.btStart)
        self.Bind(wx.EVT_BUTTON, self.OnPause, self.btPause)
        
        self.Bind(wx.EVT_BUTTON, self.OnClear, self.btClear)
        
        
        self.Bind(wx.EVT_BUTTON, self.OnSavePath, self.btSavePath)
        self.Bind(wx.EVT_BUTTON, self.OnDelPath, self.btDelPath)
        self.Bind(wx.EVT_CLOSE, self.OnCloseWindow) 

        
    #下面是公共事件
    def onInitobjFile(self):
        if self.objFile == None:
            strJbossPath = self.tcJbossLogPath.GetValue().strip()
            if strJbossPath == "":
                wx.MessageBox("请先选择Jboss所在目录", "错误")
                return 1
            strJbossPath = strJbossPath + "/server/default/log/server.log"
            if not os.path.exists(strJbossPath):
                wx.MessageBox("Jboss日志文件不存在", "错误")
                return 1
            self.objFile = open(strJbossPath,"r")
            
            #初始化打开文件时,先移动到文本尾端
            sline = self.objFile.readline()
            while sline:
                sline = self.objFile.readline()
                
        return 0

    def showDirDialog(self, dialogTitle):
        path = ""
        dlg = wx.DirDialog(self, dialogTitle,
                      style=wx.DD_DEFAULT_STYLE
                       #| wx.DD_DIR_MUST_EXIST
                       #| wx.DD_CHANGE_DIR
                       )
        if dlg.ShowModal() == wx.ID_OK:
            path = dlg.GetPath()
            path = path.replace("\\","/")
        dlg.Destroy()
        return path


    #下面是响应事件
    
    def OnClear(self, event):
        #先保存好currentState原来的值,在清理动作完成后,要还原这个状态
        oldcurrentState = self.currentState
        self.currentState = 0
        self.mtLogBox.Clear()
        
        if self.objFile:
            sline = self.objFile.readline()
            while sline:
                sline = self.objFile.readline()
        self.currentState = oldcurrentState
    
    def OnPause(self, event):

        if self.objFile:
            if self.currentState == 0:
                self.currentState = 1
                self.btPause.SetLabel('〓pause')
                self.btPause.SetForegroundColour("black")
                if not self.readingThreading.isAlive():
                    self.readingThreading = None
                    self.readingThreading = threading.Thread(None,self.realTimeMonitorLog)
                    self.readingThreading.start()
            else:
                self.currentState = 0
                self.btPause.SetLabel('〓continue')
                self.btPause.SetForegroundColour("blue")
    
    def OnStart(self, event):
        if self.currentState == 0:
           
            #初始化日志文件对象,如果路径不对就返回
            if self.onInitobjFile():
                return
            
            self.btStart.SetLabel('■stop')
            self.btStart.SetForegroundColour("red")
            self.currentState =  1
            
            #初始化成功后,调用realTimeMonitorLog方法显示日志
            self.readingThreading = threading.Thread(None,self.realTimeMonitorLog)
            self.readingThreading.start()     
        else:
            self.currentState = 0
            if self.objFile != None:
                self.objFile.close()
                self.objFile = None
                
            self.btStart.SetLabel('▲start')
            self.btStart.SetForegroundColour("green")
            
    
    def realTimeMonitorLog(self):
        while self.currentState == 1:
            sline = self.objFile.readline()
            while sline:
                self.mtLogBox.AppendText(sline)
                if self.currentState == 1:
                    sline = self.objFile.readline()
                else:
                    sline = None
            time.sleep(1)
    
    def OnGetJbossLogPath(self, event):
        path = self.showDirDialog("请选择Jboss所在目录")
        if path:
            self.tcJbossLogPath.Clear()
            self.tcJbossLogPath.WriteText(path)

    def OnCloseWindow(self, event):
        self.currentState = 0
        time.sleep(1)
        if self.objFile != None:
            self.objFile.close()
            self.objFile = None
        self.Destroy()
        
    def OnCopy(self, event):
        self.mtLogBox.SelectAll()
        self.mtLogBox.Copy()
    
    def OnSavePath(self, event):
        self.controlConf("a",self.tcJbossLogPath.GetValue())
        
    def OnDelPath(self, event):
        self.controlConf("d",self.tcJbossLogPath.GetValue())
        
    def controlConf(self, m, s):
        """
        m的参数 r 代表读  a 代表增加 d 代表删除
        s jboss路径
        """
        conn = sqlite3.connect("wb.db3")
        stmt = conn.cursor()
        conn.execute("create table if not exists jboss(id integer primary key autoincrement, path text)")
        paths = None
        if m == 'r':
            paths = []
            stmt.execute("select trim(path) from jboss order by id")
            rs = stmt.fetchall()
            for row in rs:
                paths.append(row[0])
            
        elif m == 'a':
            if s is None or s.strip() == '':
                wx.MessageBox("JBOSS路径不能为空", "错误")
            else:
                s = s.strip()
                stmt.execute("select id from jboss where path = ? limit 1",s)
                if stmt.fetchone[0][0] > 0:
                    wx.MessageBox('"' + s + '"已存在', "错误")
                else:
                    stmt.execute("insert into jboss(path) values(?)",s)
        stmt.close()
        conn.close()
        return paths

class LogViewApp(wx.App):
    def OnInit(self):
        self.mainFrame = LogViewFrame()
        self.mainFrame.Show()
        self.SetTopWindow(self.mainFrame)
        return True

if __name__ == "__main__":
    logviewApp = LogViewApp()
    logviewApp.MainLoop()

摘自:http://superxgz.iteye.com/blog/422467

阅读(1677) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~