diff --git a/scripts/addons_core/io_scene_gltf2/__init__.py b/scripts/addons_core/io_scene_gltf2/__init__.py index 8704481dd4e..4f9a0cdc5a7 100755 --- a/scripts/addons_core/io_scene_gltf2/__init__.py +++ b/scripts/addons_core/io_scene_gltf2/__init__.py @@ -5,7 +5,7 @@ bl_info = { 'name': 'glTF 2.0 format', 'author': 'Julien Duroure, Scurest, Norbert Nopper, Urs Hanselmann, Moritz Becher, Benjamin Schmithüsen, Jim Eckerlein, and many external contributors', - "version": (4, 2, 79), + "version": (4, 2, 80), 'blender': (4, 2, 0), 'location': 'File > Import-Export', 'description': 'Import-Export as glTF 2.0', @@ -981,6 +981,12 @@ class ExportGLTF2_Base(ConvertGLTF2_Base): default=False ) + export_loglevel: IntProperty( + name='Log Level', + description="Log Level", + default=-1, + ) + # Custom scene property for saving settings scene_key = "glTF2ExportSettings" @@ -1066,7 +1072,11 @@ class ExportGLTF2_Base(ConvertGLTF2_Base): # All custom export settings are stored in this container. export_settings = {} - export_settings['loglevel'] = set_debug_log() + # Get log level from parameters + # If not set, get it from Blender app debug value + export_settings['gltf_loglevel'] = self.export_loglevel + if export_settings['gltf_loglevel'] < 0: + export_settings['loglevel'] = set_debug_log() export_settings['exported_images'] = {} export_settings['exported_texture_nodes'] = [] diff --git a/scripts/addons_core/io_scene_gltf2/io/com/gltf2_io_debug.py b/scripts/addons_core/io_scene_gltf2/io/com/gltf2_io_debug.py index 889e93bbae4..4036c55011a 100755 --- a/scripts/addons_core/io_scene_gltf2/io/com/gltf2_io_debug.py +++ b/scripts/addons_core/io_scene_gltf2/io/com/gltf2_io_debug.py @@ -9,6 +9,7 @@ import time import logging import logging.handlers +import sys # # Globals @@ -65,22 +66,30 @@ def profile_end(label=None): class Log: def __init__(self, loglevel): self.logger = logging.getLogger('glTFImporter') + self.error_logger = logging.getLogger('glTFImporter_errors') # For console display - self.console_handler = logging.StreamHandler() + self.console_handler = logging.StreamHandler(sys.stdout) formatter = logging.Formatter('%(asctime)s | %(levelname)s: %(message)s', "%H:%M:%S") self.console_handler.setFormatter(formatter) + # For console display - errors + self.error_console_handler = logging.StreamHandler(sys.stderr) + formatter_error = logging.Formatter('%(asctime)s | %(levelname)s: %(message)s', "%H:%M:%S") + self.error_console_handler.setFormatter(formatter_error) + # For popup display self.popup_handler = logging.handlers.MemoryHandler(1024 * 10) self.logger.addHandler(self.console_handler) + self.error_logger.addHandler(self.error_console_handler) # self.logger.addHandler(self.popup_handler) => Make sure to not attach the popup handler to the logger self.logger.setLevel(int(loglevel)) + self.error_logger.setLevel(logging.ERROR) def error(self, message, popup=False): - self.logger.error(message) + self.error_logger.error(message) if popup: self.popup_handler.buffer.append(('ERROR', message)) @@ -100,7 +109,7 @@ class Log: self.popup_handler.buffer.append(('DEBUG', message)) def critical(self, message, popup=False): - self.logger.critical(message) + self.error_logger.critical(message) if popup: # There is no Critical level in Blender, so we use error self.popup_handler.buffer.append(('ERROR', message)) @@ -115,5 +124,6 @@ class Log: def flush(self): self.logger.removeHandler(self.console_handler) + self.error_logger.removeHandler(self.error_console_handler) self.popup_handler.flush() self.logger.removeHandler(self.popup_handler)