loglimit.py 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. #!/usr/bin/env python2
  2. # -*- coding:utf-8 -*-
  3. import sh
  4. import os
  5. from .hook import JobHook
  6. from datetime import datetime
  7. class LogLimitHook(JobHook):
  8. def __init__(self, limit=10):
  9. self.limit = limit
  10. def before_job(self, provider, ctx={}, *args, **kwargs):
  11. log_dir = provider.log_dir
  12. self.ensure_log_dir(log_dir)
  13. log_file = provider.log_file.format(
  14. date=datetime.now().strftime("%Y-%m-%d_%H-%M"))
  15. ctx['log_file'] = log_file
  16. if log_file == "/dev/null":
  17. return
  18. log_link = os.path.join(log_dir, "latest")
  19. ctx['log_link'] = log_link
  20. lfiles = [os.path.join(log_dir, lfile)
  21. for lfile in os.listdir(log_dir)
  22. if lfile.startswith(provider.name)]
  23. lfiles_set = set(lfiles)
  24. # sort to get the newest 10 files
  25. lfiles_ts = sorted(
  26. [(os.path.getmtime(lfile), lfile) for lfile in lfiles],
  27. key=lambda x: x[0],
  28. reverse=True)
  29. lfiles_keep = set([x[1] for x in lfiles_ts[:self.limit]])
  30. lfiles_rm = lfiles_set - lfiles_keep
  31. # remove old files
  32. for lfile in lfiles_rm:
  33. try:
  34. sh.rm(lfile)
  35. except:
  36. pass
  37. # create a soft link
  38. self.create_link(log_link, log_file)
  39. def after_job(self, status=None, ctx={}, *args, **kwargs):
  40. log_file = ctx.get('log_file', None)
  41. log_link = ctx.get('log_link', None)
  42. if log_file == "/dev/null":
  43. return
  44. if status == "fail":
  45. log_file_save = log_file + ".fail"
  46. try:
  47. sh.mv(log_file, log_file_save)
  48. except:
  49. pass
  50. self.create_link(log_link, log_file_save)
  51. def ensure_log_dir(self, log_dir):
  52. if not os.path.exists(log_dir):
  53. sh.mkdir("-p", log_dir)
  54. def create_link(self, log_link, log_file):
  55. if log_link == log_file:
  56. return
  57. if not (log_link and log_file):
  58. return
  59. if os.path.lexists(log_link):
  60. try:
  61. sh.rm(log_link)
  62. except:
  63. return
  64. try:
  65. sh.ln('-s', log_file, log_link)
  66. except:
  67. return
  68. # vim: ts=4 sw=4 sts=4 expandtab