logger.py 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. from .package_level import format_f, format_exporter_version
  2. from bpy import app
  3. from io import open
  4. from math import floor
  5. from time import time
  6. from sys import exc_info
  7. from traceback import format_tb
  8. class Logger:
  9. instance = None
  10. def __init__(self, filename):
  11. self.start_time = time()
  12. self.nWarnings = 0
  13. self.log_handler = open(filename, 'w', encoding='utf8')
  14. self.log_handler.write('Exporter version: ' + format_exporter_version() + ', Blender version: ' + app.version_string + '\n')
  15. # allow the static methods to log, so instance does not need to be passed everywhere
  16. Logger.instance = self
  17. def log_error_stack(self):
  18. ex = exc_info()
  19. Logger.log('========= An error was encountered =========', 0)
  20. stack = format_tb(ex[2])
  21. for line in stack:
  22. self.log_handler.write(line) # avoid tabs & extra newlines by not calling log() inside catch
  23. self.log_handler.write('ERROR: ' + str(ex[1]) + '\n')
  24. def close(self):
  25. Logger.log('========= end of processing =========', 0)
  26. elapsed_time = time() - self.start_time
  27. minutes = floor(elapsed_time / 60)
  28. seconds = elapsed_time - (minutes * 60)
  29. Logger.log('elapsed time: ' + str(minutes) + ' min, ' + format_f(seconds) + ' secs', 0)
  30. self.log_handler.close()
  31. Logger.instance = None
  32. @staticmethod
  33. def warn(msg, numTabIndent = 1, noNewLine = False):
  34. Logger.log('WARNING: ' + msg, numTabIndent, noNewLine)
  35. Logger.instance.nWarnings += 1
  36. @staticmethod
  37. def log(msg, numTabIndent = 1, noNewLine = False):
  38. # allow code that calls Logger run successfully when not logging
  39. if Logger.instance is None: return
  40. for i in range(numTabIndent):
  41. Logger.instance.log_handler.write('\t')
  42. Logger.instance.log_handler.write(msg)
  43. print(msg) # for debugging / running Blender fron console
  44. if not noNewLine: Logger.instance.log_handler.write('\n')