作了两个版本,一是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())

最新文章

  1. 再谈C#采集,一个绕过高强度安全验证的采集方案?方案很Low,慎入
  2. mvc 中关于资源文件的扩展
  3. ABAP 内表的行列转换-发货通知单-打印到Excel里
  4. bzoj 3365 [Usaco2004 Feb]Distance Statistics 路程统计(点分治,单调)
  5. [Bootstrap] 4. Typogrphy
  6. Java Web SSH框架总是无法写入无法读取Cookie
  7. linux 信号signal和sigaction理解
  8. 网上下载的“上下3D”和“左右3D”影片该如何播放?
  9. Lua学习笔记4. coroutine协同程序和文件I/O、错误处理
  10. Ubuntu16.04安装piwik3.0.1
  11. ASP.NET Core读取AppSettings
  12. 如何缩放SpriteBuilder中的scene
  13. 蓝牙secure simple pair 概述
  14. div上下左右居中
  15. Shell 使用 expr 进行数学运算
  16. 面向连接的TCP概述
  17. Multi-View Region Adaptive Multi-temporal DMM and RGB Action Recognition
  18. python自动化运维之路~DAY6
  19. H5音乐播放器源码地址
  20. react中为什么要使用immutable

热门文章

  1. destoon 短信发送函数及短信接口修改
  2. GoF23种设计模式之行为型模式之解释器模式
  3. python模块之pickle
  4. POJ:2955-Brackets(经典:括号匹配)
  5. KVO And KVC
  6. shutil——高级的 文件、文件夹、压缩包 处理模块
  7. thinkphp文件上传以及图片处理
  8. php_strip_whitespace和trim的搭配使用
  9. C++ ----&gt;中include &lt;iostream&gt;和include &lt;iostream.h&gt;的区别
  10. 筒子们,使用Protobuf优化你的协议