大文件LOG持续输出
2024-08-30 10:20:45
作了两个版本,一是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())
最新文章
- 再谈C#采集,一个绕过高强度安全验证的采集方案?方案很Low,慎入
- mvc 中关于资源文件的扩展
- ABAP 内表的行列转换-发货通知单-打印到Excel里
- bzoj 3365 [Usaco2004 Feb]Distance Statistics 路程统计(点分治,单调)
- [Bootstrap] 4. Typogrphy
- Java Web SSH框架总是无法写入无法读取Cookie
- linux 信号signal和sigaction理解
- 网上下载的“上下3D”和“左右3D”影片该如何播放?
- Lua学习笔记4. coroutine协同程序和文件I/O、错误处理
- Ubuntu16.04安装piwik3.0.1
- ASP.NET Core读取AppSettings
- 如何缩放SpriteBuilder中的scene
- 蓝牙secure simple pair 概述
- div上下左右居中
- Shell 使用 expr 进行数学运算
- 面向连接的TCP概述
- Multi-View Region Adaptive Multi-temporal DMM and RGB Action Recognition
- python自动化运维之路~DAY6
- H5音乐播放器源码地址
- react中为什么要使用immutable
热门文章
- destoon 短信发送函数及短信接口修改
- GoF23种设计模式之行为型模式之解释器模式
- python模块之pickle
- POJ:2955-Brackets(经典:括号匹配)
- KVO And KVC
- shutil——高级的 文件、文件夹、压缩包 处理模块
- thinkphp文件上传以及图片处理
- php_strip_whitespace和trim的搭配使用
- C++ ---->;中include <;iostream>;和include <;iostream.h>;的区别
- 筒子们,使用Protobuf优化你的协议