glTF exporter: Fix Regression #128807 - avoid spaming stdout

error log will go to stderr, and others to stdout
A new parameter in operator to set the loglevel from command line bpy.ops.export_scene.gltf(loglevel=logging.INFO)
If not set from the ops, value is -1, and is set, as before, from the bpy.app.debug_value

Pull Request: https://projects.blender.org/blender/blender/pulls/130263
This commit is contained in:
Julien Duroure
2024-10-31 14:28:40 +01:00
committed by Gitea
parent 3b8365ae3b
commit 47631908de
2 changed files with 25 additions and 5 deletions
+12 -2
View File
@@ -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'] = []
@@ -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)