日志监控及Redis存储

来源:互联网 发布:最难就业的专业 知乎 编辑:程序博客网 时间:2024/06/05 20:03
背景:公司项目中需要将客户端访问日志进行监控,并实时将更新内容开放给测试同事进行查询。

早期由于时间缺乏的因此,直接采用了一个效率特别低的方法进行监控。最近刚好尝试了Redis Python客户端,因此有了一个初步的想法:Log-->Redis-->Fetch,相当于。可以分解成:
1. 使用Python将Log内容存储到Redis(可以使用任何语言,采用Python只是个人的喜好)
2. 创建某个接口获取日志文件内容

话不多说,直接上代码:
  1. #!/bin/python
  2. # update.py
  3. import redis
  4. import json
  5. import datetime
  6. import sys
  7. import time
  8. import subprocess
  9. import shlex
  10. import pdb
  11. r = redis.StrictRedis(host=<your host>, port=<port>, db=0, password=<your pass>) # 设置Redis服务器
  12. if r.ping()
  13. def main():
  14. cnt = 1
  15. for line in sys.stdin:
  16.         r.set(++cnt, line)
  17. main()
使用的方法: tail -f ~/log.log | python update.py。运行后,发现能够更新一些数据,但是无法更新运行后期加入的文件内容。这个问题,到现在自己也没有明白,按道理,管理作为Python输入是可以生效的。有明白的同学,麻烦告诉我下!

第一次尝试失败后,自己就思考:如何能在Python中监控新加入的内容,是否就可以解决自己的问题?于是Google后,发现另外一个方法:subprocess.Popen。在仔细地阅读后,自己发现这个方法和上面代码中用到的方法没什么差别,只不过是用Python代码来表现而已。直接上代码:
  1. #!/bin/python
  2. # update_sec.py
  3. import redis
  4. import json
  5. import datetime
  6. import sys
  7. import time
  8. import subprocess
  9. import shlex
  10. import pdb
  11. r = redis.StrictRedis(host=<your host>, port=<port>, db=0, password=<your pass>)
  12. r.ping()
  13. def main():
  14. cmd = "tail -f ~/test.log"
  15. cmd = shlex.split(cmd)
  16. curr_day = datetime.date.today()
  17. process = subprocess.Popen(cmd, stdout=subprocess.PIPE)
  18. print cmd
  19. while True:
  20. line = process.stdout.readline()
  21. if line == '' and process.poll() is not None:
  22. break;
  23. if line:
  24. # add line process logic
  25. r.set(cnt, line)
  26. rc = process.poll()
  27. print "return code :" , rc
  28. main()

说明:
1. subprocess.Popen相当于创建一个子进程,并将子进程的输出通过管道输入到主进程;
2. subprocess.poll()用于判断子进程是否停止,process.stdout为子进程的输出文件描述符

开启python update_sec.py后,向~/test.log追加内容,发现能够实时更新日志数据到Redis了,问题解决!

当然了,这只是解决问题的一个方法。这个方法无法监控某个文件夹内符合一定格式的文件内容,一个想法就是采用pyinotify监控某文件夹内文件的创建,如果文件名符合目标格式,就开始采用上面的处理流程。

如果大家有更好的方法,可以留言告诉我!
完-------------------
0 0