作了两个版本,一是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持续输出的更多相关文章

  1. FileOutputStream字节输出流和FileInputStream输入流(切记:out是输出到本地中,in是输入到程序中)这里介绍大文件和小文件的读取方式

    //FileOutputStream public class FileOutputStreamDemo { /**字节流:适用于任何文件,以字节为单位,进行读写操作  *字节流操作步骤:  *1.创 ...

  2. Linux大文件已删除,但df查看已使用的空间并未减少解决

    在我的生活当中遇到磁盘快满了,这时候准备去删除一些大文件 于是我使用ncdu 查看了一下当前系统占用资源比较多的是那些文件,结果一看是elasticsearch的日志文件,好吧,竟然找到源头了,那就把 ...

  3. centos磁盘爆满,查找大文件并清理

    今天发现vps敲入crontab -e 居然提示 “Disk quota exceeded” 无法编辑.于是"df -h"查了查发现系统磁盘空间使用100%了.最后定位到是/var ...

  4. Linux如何查找大文件或目录总结及在全部目录中查找

    在Windows系统中,我们可以使用TreeSize工具查找一些大文件或文件夹,非常的方便高效,在Linux系统中,如何去搜索一些比较大的文件呢?下面我整理了一下在Linux系统中如何查找大文件或文件 ...

  5. linux下磁盘占用达到100%了,找不到哪些大文件耗尽了磁盘

    Linux下的根分区使用率100%,但是查看/分区下的目录都不大,没有占用满,这该怎么处理? 重启是肯定有效的,目前处理情况:重新restart应用后,空间释放出来 1.lsof | grep del ...

  6. Git从库中移除已删除大文件

    写在前面大家一定遇到过在使用Git时,不小心将一个很大的文件添加到库中,即使删除,记录中还是保存了这个文件.以后不管是拷贝,还是push/pull都比较麻烦.今天在上传工程到github上,发现最大只 ...

  7. git 彻底删除历史记录中的大文件

    Reference 大家一定遇到过在使用Git时,不小心将一个很大的文件添加到库中,即使删除,记录中还是保存了这个文件.以后不管是拷贝,还是push/pull都比较麻烦. === 删除大文件方法 方法 ...

  8. 【.Net】 大文件可使用的文本分组统计工具(附带源码,原创)

    本工具可实现的效果: 1.读取大文件(大于1GB) 2.根据分隔符分割后的列分组 3.速度快. 4.处理过程中,可以随时停止处理,操作不卡死. 5.有对当前内存的实时监测,避免过多占用内存,影响系统运 ...

  9. tomcat相关配置技巧梳理 (修改站点目录、多项目部署、限制ip访问、大文件上传超时等)

    tomcat常用架构:1)nginx+tomcat:即前端放一台nginx,然后通过nginx反向代理到tomcat端口(可参考:分享一例测试环境下nginx+tomcat的视频业务部署记录)2)to ...

随机推荐

  1. LeetCode之螺旋矩阵

    问题 螺旋矩阵 给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素. 示例 1: 输入: [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ ...

  2. PHP 代码优化建议

    1.尽量静态化: 如果一个方法能被静态,那就声明它为静态的,速度可提高1/4,甚至我测试的时候,这个提高了近三倍.当然了,这个测试方法需要在十万级以上次执行,效果才明显.其实静态方法和非静态方法的效率 ...

  3. nova虚拟机镜像从创建到文件系统resize完整流程

    1. 虚拟机镜像的创建和resize流程 nova创建虚拟机涉及的组件比较多,调用比较复杂,这里只列出跟虚拟机镜像创建相关的流程,方便理清虚拟机状态变化的整个流程. nova-api nova.api ...

  4. Linux学习-什么是登录档

    CentOS 7 登录档简易说明 登录档的重要性 为什么说登录文件很重要, 解决系统方面的错误: 用 Linux 这么久了,你应该偶而会发现系统可能会出现一些错误,包括硬件捉不到或者是某些系 统服务无 ...

  5. Android开发——Android 6.0权限管理机制详解

    .Android 6.0运行时主动请求权限 3.1  检测和申请权限 下面的例子介绍上面列出的读写SD卡的使用例子,可以使用以下的方式解决: public boolean isGrantExterna ...

  6. python - work3

    # -*- coding:utf-8 -*- '''@project: jiaxy@author: Jimmy@file: work_20181107.py@ide: PyCharm Communit ...

  7. 常见python快捷键

    http://www.cnblogs.com/toutou/p/4778818.html Ctrl+/注释(取消注释)选择的行 Shift + Enter开始新行 Ctrl + Enter智能换行 T ...

  8. hiho编程练习赛20

    模版题的世界 题目1 : 无根数变有根树 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一棵包含 N 个节点的无根树,小Hi想知道如果指定其中某个节点 K 为根,那 ...

  9. Java学习ing

    ConcurrentHashMap从JDK1.5开始随java.util.concurrent包一起引入JDK中,主要为了解决HashMap线程不安全和Hashtable效率不高的问题. Concur ...

  10. Educational Codeforces Round 20 A. Maximal Binary Matrix

    A. Maximal Binary Matrix time limit per test 1 second memory limit per test 256 megabytes input stan ...