用于扫描日志以从不同服务器一次性获取异常的Shell脚本

时间:2015-10-15 11:35:27

标签: python shell

我有一项任务是准备一个脚本来扫描来自不同Unix服务器的日志(对于同一个应用程序)。要求是准备shell脚本,我将传递字符串作为输入,需要在不同的日志位置(差异服务器)进行grep。

因此,脚本应该从一个文件读取服务器并将结果存储在特定位置。

1 个答案:

答案 0 :(得分:1)

看一下能够帮助你的multitail

multitail -l 'ssh user@host1 "tail -f /path/to/log/file"' -l 'ssh user@host2 "tail -f /path/to/log/file"'

从不同的服务器收集日志。

编辑:

  1. 连续跑步:
  2. 如果要在远程收集的每个日志文件中搜索某些行,则如下所示:

    multitail -E "search-string" --mergeall -l 'ssh user@host1 "tail -f /path/to/log/file"' -l 'ssh user@host2 "tail -f /path/to/log/file"'
    

    这将连续运行(每个方框上的tailf),只显示包含“search-string”的行。您需要在框中使用无密码登录(请参阅this)。

    1. 在整个日志文件上运行一次
    2. 有很多方法可以做到这一点,包括bash,但我最喜欢pythonic方式。如果你想在python中这样做,试试这个。请注意,这也意味着在主机上为给定用户进行无密码登录:

      import subprocess
      import re
      
      files = [
          ['user@host1', '/path/to/logfile'],
          ['user@host2', '/path/to/logfile'],
      ]
      
      
      def get_lines(search_key):
          for item in enumerate(files):
              server = item[1][0]
              logfile = item[1][1]
              ssh = subprocess.Popen(['ssh', server, 'cat', logfile],
                                     stdout=subprocess.PIPE)
              for line in iter(ssh.stdout.readlines()):
                  line=str(line, encoding='UTF-8')
                  if re.search(search_key, line):
                      print(line)
      
      
      def main():
          get_lines("needle")
      
      
      if __name__ == "__main__":
          main()