当我们维护一个网站时,无论前台还是后台,经常会出现各种个样的问题。有时候问题很难直观的发现,这个时候只能查看各种日志来跟踪问题。但是查看日志有各种个样的问题。首先,要用各种工具登陆到服务器,这个有时候很麻烦。登录上去可能没有合适的工具查看日志,就算有,中文偶尔也会来个乱码啥的。最郁闷的是有的日志文件很大,打开要等很久,看起来也不方便。

基于上面的原因,我用python的bottle模块做了个web版的分页日志查看器,bottle怎么安装使用具体可看下面的指南:
          http://bottlepy.org/docs/dev/tutorial.html

这里没有太多考虑安全因素,如果考虑安全最好加个简单的登录功能,或者直接对请求ip进行校验。性能方面还需要优化,文件太大还是有点慢。
    下面是实现代码,只有一个文件:

 #coding=utf-8
'''
日志文件查看器
Created on 2013年8月20日 @author: alala
''' import os
import bottle
from bottle import route, run, template #将自定义模板目录添加到模板搜索路径集合
templatesDir = os.getcwd()
bottle.TEMPLATE_PATH.insert(0,templatesDir) #日志根目录
LOG_DIR = "/Tem/"
#每页显示日志行数
PAGE_SIZE = 4000 #列出某个子目录的所有日志文件
@route('/')
@route('/<dirName>')
def listDir(dirName='logs'):
if dirName == 'favicon.ico':
return 0
#读取目录
files = os.listdir(LOG_DIR + dirName)
return template('logList', files=files,dirName=dirName) #查看某个日志文件
@route('/<dirName>/<logFile>')
@route('/<dirName>/<logFile>/<pageNo>')
def viewLog(dirName,logFile,pageNo=-1):
filePath = LOG_DIR + dirName + "/" + logFile;
pageNo = int(pageNo) #获取日志行数
lineCount = 0
f = open(filePath, 'rb')
try:
while True:
buf = f.read(1024*1024)
if not buf:
break
lineCount += buf.count('\n')
finally:
f.close()
#计算页数
pageCount = lineCount / PAGE_SIZE
if lineCount % PAGE_SIZE != 0:
pageCount += 1
#调整当前页码
print (pageNo, pageCount, pageNo >= pageCount)
if (pageNo < 0) or (pageNo >= pageCount) or (pageNo == -1):
pageNo = pageCount - 1 #读取当页日志
lines = []
f = open(filePath, 'r')
try:
maxNo = (pageNo + 1) * PAGE_SIZE
minNo = pageNo * PAGE_SIZE
lineNo = 0
for line in f:
if lineNo >= maxNo:
break
elif lineNo >= minNo:
lines.append(line)
lineNo += 1
finally:
f.close()
#使用模板构建显示页面
return template('logView', dirName = dirName, logFile = logFile,
pageNo = pageNo,lines = lines, pageCount = pageCount) run(host='localhost', port=5200)
#paste提供多线程请求处理,性能比默认的好
#run(host='localhost', port=5200,server='paste')

下面是使用到的两个模板:

%for f in files:
<a href="{{'/%s/%s' % (dirName, f)}}">{{f}}</a><br/>
%end

logList.tpl

%for i in range(0,pageCount):
<a href="{{'/%s/%s/%s' % (dirName, logFile, i)}}"
style="color:{{'red' if pageNo == i else 'black'}};">{{i}}</a>
%end
<br/>
<br/>
%for line in lines:
{{line}}<br/>
%end

logView.tpl

python实现web分页日志查看的更多相关文章

  1. Python 简易web日志查看工具&可改装为命令行工具

    Python 简易web日志查看工具&可改装为命令行工具 效果图 原理 利用python的paramiko库模拟ssh登录操作,并执行tail命令 所需库 flask.paramiko.gev ...

  2. python web 分页组件

    闲来无事便写了一个易使用,易移植的Python Web分页组件.使用的技术栈是Python.Django.Bootstrap. 既然是易使用.易移植的组件,首先介绍一下其在django框架中的调用方式 ...

  3. journalctl 日志查看方法

    1  概述 日志管理工具journalctl是centos7上专有的日志管理工具,该工具是从message这个文件里读取信息.Systemd统一管理所有Unit的启动日志.带来的好处就是,可以只用jo ...

  4. Python Flask Web 框架入门

    Python Flask 目录 本文主要借鉴 letiantian 的文章 http://www.letiantian.me/learn-flask/ 一.简介 二.安装 三.初始化Flask 四.获 ...

  5. 在 Windows 上使用 Python 进行 web 开发

    本文由葡萄城技术团队于原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 上一篇我们介绍了在Windows 10下进行初学者入门开发Python的指 ...

  6. Centos7 日志查看工具

    1  概述     日志管理工具journalctl是centos7上专有的日志管理工具,该工具是从message这个文件里读取信息.Systemd统一管理所有Unit的启动日志.带来的好处就是,可以 ...

  7. 比我的脸还干的gan货——Python Flask Web 框架入门

    Flask是一个轻量级的基于Python的web框架. 本文适合有一定HTML.Python.网络基础的同学阅读. 1. 简介 这份文档中的代码使用 Python 3 运行.是的,所以读者需要自己在电 ...

  8. Python之Web框架Django

    Python之Web框架: Django 一. Django Django是一个卓越的新一代Web框架 Django的处理流程 1. 下载地址  Python 下载地址:https://www.pyt ...

  9. 机器数据的价值 - Web 访问日志和数据库审计日志

    计算机数据 大量的数据流,不断增长的来源,蕴含着巨大的价值 在 Splunk,我们大量谈及计算机数据.这些数据是指在数据中心.“物联网”和互联设备世界中运行的所有系统产生的数据.其中包括支撑组织的应用 ...

随机推荐

  1. STM32F0xx_SPI读写(Flash)配置详细过程

    Ⅰ.概述 关于SPI(Serial Peripheral Interface)串行外设接口可以说是单片机或者嵌入式软件开发人员必须掌握的一项通信方式,就是你在面试相关工作的时候都可能会问及这个问题.在 ...

  2. 第三节:卸载AppDomain

    AppDomain很出色的一个能力就是它允许卸载.卸载AppDomain会导致CLR卸载AppDomain中的所有程序集.还会释放AppDomain的Loader堆.为了卸载一个AppDomain,可 ...

  3. JavaWeb之 JSP:自定义标签

    当jsp的内置标签和jstl标签库内的标签都满足不了需求,这时候就需要开发者自定义标签. 自定义标签 下面我们先来开发一个自定义标签,然后再说它的原理吧! 自定义标签的开发步骤 步骤一 编写一个普通的 ...

  4. C# 堆和栈的区别-该文转自:http://www.itcodes.cn/746.html | 程序人生

    理解堆与栈对于理解.NET中的内存管理.垃圾回收.错误和异常.调试与日志有很大的帮助.垃圾回收的机制使程序员从复杂的内存管理中解脱出来,虽然绝大多数的C#程序并不需要程序员手动管理内存,但这并不代表程 ...

  5. Java动态替换InetAddress中DNS的做法简单分析2

    import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.i ...

  6. iOS下日期的处理

    NSDate存储的是世界标准时(UTC),输出时需要根据时区转换为本地时间 Dates         NSDate类提供了创建date,比较date以及计算两个date之间间隔的功能.Date对象是 ...

  7. Jsp实现筛选并压缩文件批量下载

    Jsp实现筛选并压缩文件批量下载 首先明确一下需求,网页端点击一下button,传递特定的参数到download.jsp网页,筛选文件,对过滤得到的文件进行压缩,然后返回前端一个压缩包下载. 以下的代 ...

  8. QWidget设置为模态问题

    设置QWidget的Qt::WindowModality属性为Qt::WindowModal和Qt::ApplicationModal,发现窗体仍然不会模态,网上查了一下,有人说改属性只对window ...

  9. Json.Net使用JSON Schema验证JSON格式【实例】

    给出一个Json,验证其格式是否符合规则. { "coord": { //对象 "lon": 145.77, "lat": -16.92 } ...

  10. [shell基础]——整数比较;字符串比较;文件测试;逻辑测试符

    整数比较方法一:[  ] 或 [[  ]]   (1) 此方法需要使用整数比较运算符.[标注:equal 等于   greater 大于   less-then 小于] (2) 使用时一定要注意前后一 ...