logger.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. # A really simple rotating logger
  2. import time
  3. class Logger(object):
  4. DEBUG = 10
  5. INFO = 20
  6. WARNING = 30
  7. WARN = WARNING
  8. ERROR = 40
  9. def __init__(self, outputfile, max_len, level=INFO,
  10. interactive=False):
  11. # Specify a logfile, the max length of the file before rotating,
  12. # the minimum level to log, and whether this is being run interactivly.
  13. # If it is interactive, we also print messages in addition to saving
  14. # them to the file.
  15. self.outputfile = outputfile
  16. self.backupfile = outputfile + '.1'
  17. self.max_len = max_len
  18. self.level = level
  19. self.interactive = interactive
  20. self.size_written = 0
  21. import os
  22. try:
  23. os.stat(self.outputfile)
  24. # If we get here there is an old log file in place.
  25. # We force a rotation.
  26. self._rotate()
  27. except:
  28. self.fileobj = open(outputfile, 'w')
  29. def _write(self, levelname, msg):
  30. lt = time.localtime()
  31. data = '%d-%02d-%02d %02d:%02d:%02d [%s] %s\n' % \
  32. (lt[0], lt[1], lt[2], lt[3], lt[4], lt[5], levelname, msg)
  33. if (len(data) + self.size_written)>self.max_len:
  34. self.fileobj.close()
  35. self._rotate()
  36. self.fileobj.write(data)
  37. self.fileobj.flush()
  38. self.size_written += len(data)
  39. if self.interactive:
  40. print(data, end="")
  41. def _rotate(self):
  42. import os
  43. try:
  44. os.stat(self.backupfile)
  45. # this only gets run if the file exists
  46. os.remove(self.backupfile)
  47. except:
  48. pass
  49. print("running rotate")
  50. os.rename(self.outputfile, self.backupfile)
  51. self.size_written = 0
  52. self.fileobj = open(self.outputfile, 'w')
  53. def debug(self, msg):
  54. if self.level <= Logger.DEBUG:
  55. self._write('DBG', msg)
  56. def info(self, msg):
  57. if self.level <= Logger.INFO:
  58. self._write('INF', msg)
  59. def warning(self, msg):
  60. if self.level <= Logger.WARNING:
  61. self._write('WRN', msg)
  62. warn = warning
  63. def error(self, msg):
  64. if self.level <= Logger.ERROR:
  65. self._write('ERR', msg)
  66. def set_level(self, level):
  67. self.level = level
  68. def close(self):
  69. self.fileobj.close()
  70. self.fileobj = None
  71. _logger = None
  72. def initialize_logging(filename, max_len=32000, level=Logger.INFO,
  73. interactive=False):
  74. global _logger
  75. if _logger!=None:
  76. raise Exception("Logger was already initialized!")
  77. _logger = Logger(filename, max_len, level, interactive)
  78. def get_logger():
  79. global _logger
  80. if _logger!=None:
  81. return _logger
  82. else:
  83. raise Exception("Logger was not yet initialized!")
  84. def close_logging():
  85. global _logger
  86. if _logger:
  87. _logger.close()
  88. _logger = None