大文件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 ...
随机推荐
- 02 Django框架基础(APP的创建访问)
一.创建项目 1.命令:django-admin startproject sitename 2.IDLE环境:本质上都是执行上述命令 常用命令: python manage.py runserver ...
- windows server2008R2 64位 配置 mysql-8.0.15-winx64
下载mysql: 1 https://dev.mysql.com/downloads/mysql/ 如图: 然后在解压的文件夹里面新建 my.ini文件,内容如下 按 Ctrl+C 复制代码 按 Ct ...
- 【mysql】【转发】[Err]1267 - Illegal mix of collations(utf8_general_ci,IMPLICIT) and (utf8_unicode_ci,I
[Err]1267 - Illegal mix of collations(utf8_general_ci,IMPLICIT) and (utf8_unicode_ci,IMPLICIT) for o ...
- 【mysql】[Err]1267 - Illegal mix of collations(utf8_general_ci,IMPLICIT) and (utf8_unicode_ci,IMPLICIT) for operation ‘=
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
- 求数组中两两相加等于20的组合(Python实现)
题目 求数组中两两相加等于20的组合. 例:给定一个数组[1, 7, 17, 2, 6, 3, 14],这个数组中满足条件的有两对:17+3=20, 6+14=20. 解析 分为两个步骤: 先采用堆排 ...
- 安装lwqq
$ git clone https://github.com/xiehuc/pidgin-lwqq.git $ cd pidgin-lwqq/ $ sudo apt-get install cmake ...
- flask_关注者
表的模型实现 class Follow(db.Model): __tablename__ = 'follows' follower_id = db.Column(db.Integer,db.Forei ...
- CodeForces 570D DFS序 树状数组 Tree Requests
参考九野巨巨的博客. 查询一个子树内的信息,可以通过DFS序转成线形的,从而用数据结构来维护. #include <iostream> #include <cstdio> #i ...
- 【Alpha】Scrum Meeting 5-end
第一天:2019/6/19 前言: 第5次会议在6月19日由PM在教9C-501召开. 总结项目,进行单元测试并进行简单的整合.时长60min. 团队GitHub仓库 仓库连接 1.1 今日完成任务情 ...
- day07 类的进阶,socket编程初识
类的静态方法: 正常: 添加静态方法: 就会变成一个函数,不会自动传self 参数,不会调用类的变量和实例的变量 不在需要self 名义上归类管,但是它就是一个单独的函数,不在需要传入self,想怎 ...