parse_event_log.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. # coding=utf-8
  2. import os, sys
  3. import subprocess
  4. from collections import Counter
  5. import datetime
  6. PROJECT_ROOT = os.path.join(os.path.abspath(os.path.split(os.path.realpath(__file__))[0] + "/.."), '..')
  7. sys.path.insert(0, PROJECT_ROOT)
  8. os.environ["DJANGO_SETTINGS_MODULE"] = "configs.production"
  9. from script.base import init_env
  10. init_env(False)
  11. from apps.web.device.models import Device, DeviceDict, EventTimes
  12. def carry_out_command(logs, st, et): # type: (str, str, str) -> list
  13. """
  14. 执行筛选日志的命令
  15. st et 为时间格式 只能到小时 YYYY-MM-DD HH
  16. """
  17. # 该指令的作用是 筛选出所有的时间段内的日志 然后删选出100事件 最后筛选出设备的编号 两个管道处理
  18. cmd = "sed -n '/%s*/,/%s*/p' %s | grep -oP 'server/\d{15}/100' | cut -c8-22" % (st, et, logs)
  19. s = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True)
  20. devNos = list()
  21. for line in s.stdout.readlines():
  22. devNos.append(line)
  23. return devNos
  24. def dump_data(devNo, times, date):
  25. dev = Device.get_dev(devNo) # type: DeviceDict
  26. if not dev:
  27. server = ""
  28. devTypeCode = ""
  29. driverCode = ""
  30. driverVersion = ""
  31. else:
  32. server = dev.server
  33. devTypeCode = dev.devTypeCode
  34. driverCode = dev.driverCode
  35. driverVersion = dev.driverVersion
  36. # EventTimes(devNo=devNo, driverCode=driverCode, driverVersion=driverVersion, devTypeCode=devTypeCode, server=server, times=times, date=date).save()
  37. return "times = {}, devNo = {}, devType = {}, driver = {}, server = {}, date = {}".format(times, devNo, devTypeCode, driverCode, server, date)
  38. def main():
  39. LOG_FILES = [
  40. "/var/log/washpayer/eventer/1883/listener/server.log",
  41. "/var/log/washpayer/eventer/1884/listener/server.log",
  42. "/var/log/washpayer/eventer/1885/listener/server.log",
  43. "/var/log/washpayer/eventer/1886/listener/server.log",
  44. "/var/log/washpayer/eventer/1887/listener/server.log",
  45. "/var/log/washpayer/eventer/1883/listener/server.log.?",
  46. "/var/log/washpayer/eventer/1884/listener/server.log.?",
  47. "/var/log/washpayer/eventer/1885/listener/server.log.?",
  48. "/var/log/washpayer/eventer/1886/listener/server.log.?",
  49. "/var/log/washpayer/eventer/1887/listener/server.log.?",
  50. "/var/log/washpayer/eventer/1883/listener/server.log.1?",
  51. "/var/log/washpayer/eventer/1884/listener/server.log.1?",
  52. "/var/log/washpayer/eventer/1885/listener/server.log.1?",
  53. "/var/log/washpayer/eventer/1886/listener/server.log.1?",
  54. "/var/log/washpayer/eventer/1887/listener/server.log.1?",
  55. "/var/log/washpayer/eventer/1883/listener/server.log.2?",
  56. "/var/log/washpayer/eventer/1884/listener/server.log.2?",
  57. "/var/log/washpayer/eventer/1885/listener/server.log.2?",
  58. "/var/log/washpayer/eventer/1886/listener/server.log.2?",
  59. "/var/log/washpayer/eventer/1887/listener/server.log.2?",
  60. ]
  61. logs = " ".join(LOG_FILES)
  62. # 时间是永远收集上一个小时的 1点执行,收集12点-1点的 2点20执行 收集1点-2点的
  63. now = datetime.datetime.now()
  64. st = now - datetime.timedelta(hours=1)
  65. et = now - datetime.timedelta(hours=0)
  66. devNos = carry_out_command(logs, st.strftime("%Y-%m-%d %H"), et.strftime("%Y-%m-%d %H"))
  67. result = Counter(devNos).most_common(100)
  68. for _devNo, _times in result:
  69. dump_data(_devNo.strip(), _times, st.strftime("%m%d%H"))
  70. if __name__ == '__main__':
  71. main()