django+tornado实现实时查看远程日志的方法

本文介绍了一种结合django和tornado的方法,通过websocket和redis实现远程日志的实时查看。利用saltstack远程执行脚本,将日志发送到redis,tornado再从redis获取并推送到浏览器。详细讲述了配置、html页面和logtail.py的实现过程,提供了github链接供参考。
摘要由CSDN通过智能技术生成

大致思路:

1.利用tornado提供的websocket功能与浏览器建立长连接,读取实时日志并输出到浏览器

2.写一个实时读取日志的脚本,利用saltstack远程执行,并把实时日志发往redis中。

3.tornado读取redis中的信息,发往浏览器。

此过程用到了redis的发布和订阅功能。

先看一下tornado中是如何处理的:


    import os
    import sys
    import tornado.websocket
    import tornado.web
    import tornado.ioloop
    import redis
    import salt.client
    
    from tornado import gen
    from tornado.escape import to_unicode
    
    from logs.utility import get_last_lines
    from logs import settings
    
    
    class SubWebSocket(tornado.websocket.WebSocketHandler):
     """
     此handler处理远程日志查看
     """
     def open(self, *args, **kwargs):
      print("opened")
    
     @gen.coroutine
     def on_message(self, message):
      # 主机名,要查看的日志路径,运行脚本的命令这些信息从浏览器传过来
      hostname, log_path, cmd = message.split("||")
      local = salt.client.LocalClient()
      r = redis.StrictRedis(host=settings.REDIS_HOST, port=settings.REDIS_PORT,
            password=settings.REDIS_PASSWD, db=5)
      # 订阅频道,服务器和日志路径确定一个频道
      key = settings.LOG_KEY.format(server=hostname.strip(), log_path=log_path.strip())
      channel = r.pubsub()
      channel.subscribe(key)
      # 异步方式执行命令,远程运行脚本
      local.cmd_async(hostname, "cmd.run", [cmd])
      try:
       while True:
        data = channel.get_message()
        if not data:
         # 如果读取不到消息,间隔一定时间,避免无谓的CPU消耗
         yield gen.sleep(0.05)
         continue
        if data["type"] == "message":
         line = format_line(data["data"])
         self.write_message(line)
      except tornado.websocket.WebSocketClosedError:
       self.close()
    
     def on_close(self):
      global FLAG
      FLAG = False
      print("closed")
    
    
    def format_line(line):
     line = to_unicode(line)
     if "INFO" in line:
      color = "#46A3FF"
     elif "WARN" in line:
      color = "#FFFF37"
     elif "ERROR" in line:
      color = "red"
     elif "CRITICAL" in line:
      color = "red"
     else:
      color = "#FFFFFF"
    
     return "<span style='color:{}'>{}</span>".format(color, line)
    
    
    class EchoWebSocket(tornado.websocket.WebSocketHandler):
     def open(self):
      print("WebSocket opened")
    
     @gen.coroutine
     def on_message(self, message):
      log = message
      print "log file: ", log
    
      try:
       with open(log, 'r') as f:
        for line in get_last_lines
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值