大文件LOG持续输出
作了两个版本,一是websocket输出,一是直接显示指定行数。
class WebSocketHandler(tornado.websocket.WebSocketHandler):
file_content = ""
filename = "test.log"
# 文件总大小,每次读取均更新长度
f_size = 0
# 每次读取的字节数,防止每次读得太多而卡死
f_chunk = 1024
# 文件读取指针位置
f_pos = 0
def check_origin(self, origin):
return True
def open(self):
pass
def update_client(self):
self.write_message(self._read_file(self.filename))
def on_message(self, message):
self.filename = '-'.join(message.split('-')[1:])
# 判断是否已存在LOG文件,如果没有,则先创建一个空文件内容
if os.path.exists("/tmp/" + self.filename):
self.update_client()
else:
with open("/tmp/" + self.filename, 'w') as f:
f.write("empty file.....\n")
def on_close(self):
pass
def _read_file(self, filename):
f = open("/tmp/"+filename, "r")
# seek里参数2是将指针放在末尾,检测文件长度
f.seek(0, 2)
self.f_size = f.tell()
# 指针复位
f.seek(self.f_pos, 0)
# 判断文件长度是否大过单次读取字节
if (self.f_size - self.f_pos) > self.f_chunk:
ret_str = f.read(self.f_chunk)
self.f_pos += self.f_chunk
return ret_str
else:
# 如果(最后)一次可读取所有字节,则文件指针指到末尾,这是考虑可能下次再读时有新数据
if self.f_size > self.f_pos:
ret_str = f.read(self.f_size - self.f_pos)
self.f_pos = self.f_size
return ret_str
elif self.f_size < self.f_pos:
return "reset"
else:
return ""
f.close()
'''
with open("/tmp/"+filename) as f:
content = f.read()
if len(content) >= len(self.file_content):
content_diff = content.replace(self.file_content, '')
self.file_content = content
return content_diff
else:
self.file_content = ""
return "reset"
'''
class IndexPageHandler(tornado.web.RequestHandler):
def get(self):
self.render("websockets.html")
class Application(tornado.web.Application):
def __init__(self):
handlers = [
(r'/ws_log/', IndexPageHandler),
(r'/websocket/ws', WebSocketHandler)
]
settings = dict(
template_path=os.path.join(os.path.dirname(__file__), "templates"),
static_path=os.path.join(os.path.dirname(__file__), "static"),
debug=True
)
tornado.web.Application.__init__(self, handlers, **settings)
if __name__ == '__main__':
ws_app = Application()
server = tornado.httpserver.HTTPServer(ws_app)
server.listen(9527)
tornado.ioloop.IOLoop.instance().start()
def sql_log(request):
dev_version = request.GET.get('dev_version')
log_line = int(request.GET.get('log_line'))
if platform.system() == "Windows":
log_file = 'd://tmp//' + dev_version
elif platform.system() == "Linux":
log_file = '/tmp/' + dev_version
else:
log_file = '/tmp/' + dev_version
with open(log_file) as f:
if log_line > 0:
sql_log_str = f.readlines()[0:log_line]
elif log_line < 0:
sql_log_str = f.readlines()[log_line:]
else:
sql_log_str = f.readlines()
return render(request, 'sar/sql_log.html', locals())
大文件LOG持续输出的更多相关文章
- FileOutputStream字节输出流和FileInputStream输入流(切记:out是输出到本地中,in是输入到程序中)这里介绍大文件和小文件的读取方式
//FileOutputStream public class FileOutputStreamDemo { /**字节流:适用于任何文件,以字节为单位,进行读写操作 *字节流操作步骤: *1.创 ...
- Linux大文件已删除,但df查看已使用的空间并未减少解决
在我的生活当中遇到磁盘快满了,这时候准备去删除一些大文件 于是我使用ncdu 查看了一下当前系统占用资源比较多的是那些文件,结果一看是elasticsearch的日志文件,好吧,竟然找到源头了,那就把 ...
- centos磁盘爆满,查找大文件并清理
今天发现vps敲入crontab -e 居然提示 “Disk quota exceeded” 无法编辑.于是"df -h"查了查发现系统磁盘空间使用100%了.最后定位到是/var ...
- Linux如何查找大文件或目录总结及在全部目录中查找
在Windows系统中,我们可以使用TreeSize工具查找一些大文件或文件夹,非常的方便高效,在Linux系统中,如何去搜索一些比较大的文件呢?下面我整理了一下在Linux系统中如何查找大文件或文件 ...
- linux下磁盘占用达到100%了,找不到哪些大文件耗尽了磁盘
Linux下的根分区使用率100%,但是查看/分区下的目录都不大,没有占用满,这该怎么处理? 重启是肯定有效的,目前处理情况:重新restart应用后,空间释放出来 1.lsof | grep del ...
- Git从库中移除已删除大文件
写在前面大家一定遇到过在使用Git时,不小心将一个很大的文件添加到库中,即使删除,记录中还是保存了这个文件.以后不管是拷贝,还是push/pull都比较麻烦.今天在上传工程到github上,发现最大只 ...
- git 彻底删除历史记录中的大文件
Reference 大家一定遇到过在使用Git时,不小心将一个很大的文件添加到库中,即使删除,记录中还是保存了这个文件.以后不管是拷贝,还是push/pull都比较麻烦. === 删除大文件方法 方法 ...
- 【.Net】 大文件可使用的文本分组统计工具(附带源码,原创)
本工具可实现的效果: 1.读取大文件(大于1GB) 2.根据分隔符分割后的列分组 3.速度快. 4.处理过程中,可以随时停止处理,操作不卡死. 5.有对当前内存的实时监测,避免过多占用内存,影响系统运 ...
- tomcat相关配置技巧梳理 (修改站点目录、多项目部署、限制ip访问、大文件上传超时等)
tomcat常用架构:1)nginx+tomcat:即前端放一台nginx,然后通过nginx反向代理到tomcat端口(可参考:分享一例测试环境下nginx+tomcat的视频业务部署记录)2)to ...
随机推荐
- java--String、StringBuilder、StringBuffer的解析和比较?
一.String的解析 1.String的含义 ①String是不可以被继承的,String类是final类,String类是由char[]数组来存储字符串. ②String是不可变的字符序列,如果存 ...
- 图解Disruptor框架(二):核心概念
图解Disruptor框架(二):核心概念 概述 上一个章节简单的介绍了了下Disruptor,这节就是要好好的理清楚Disruptor中的核心的概念.并且会给出个HelloWorld的小例子. 在正 ...
- zoj 4054
#define ll long long ; int t; ll ans,tmp; char s[N]; int main() { scanf("%d",&t); whil ...
- SmartGit 30天评估期结束解决办法
smartgit 需要输入序列号解决办法: 1.找到路径: %APPDATA%\syntevo\SmartGit\<main-smartgit-version> 然后删除: setting ...
- URLError与HTTPError
urllib2 的异常错误处理 在我们用urlopen或opener.open方法发出一个请求时,如果urlopen或opener.open不能处理这个response,就产生错误. 这里主要说的是U ...
- Linux学习-开机过程的问题解决
忘记 root 密码的解决之道 新版的 systemd 的管理机制中,默认的 rescue 模式是无法直接取得 root 权限的喔!还是得要 使用 root 的密码才能够登入 rescure 环境.没 ...
- LA 5010 Go Deeper 2-SAT 二分
题意: 有\(n\)个布尔变量\(x_i\),有一个递归函数.如果满足条件\(x[a[dep]] + x[b[dep]] \neq c[dep]\),那么就再往深递归一层. 问最多能递归多少层. 分析 ...
- HDU 5489 Removed Interval DP 树状数组
题意: 给一个长度为\(N\)的序列,要删除一段长为\(L\)的连续子序列,问所能得到的最长的\(LIS\)的长度. 分析: 设\(f(i)\)表示以\(a_i\)结尾的\(LIS\)的长度,设\(g ...
- myeclipse中hibernate生成映射文件
在hibernate中,每个数据表对应的其实是一个实体类,每个实体类有一个对应的hbm.xml配置文件匹配,myeclipse中有个MyEclipse Database Explorer视图,它提供了 ...
- ASP.Net 更新页面输出缓存的几种方法
ASP.Net 自带的缓存机制对于提高页面性能有至关重要的作用,另一方面,缓存的使用也会造成信息更新的延迟.如何快速更新缓存数据,有时成了困扰程序员的难题.根据我的使用经验,总结了下面几种方法,概括了 ...