diff --git a/__init__.py b/__init__.py index dedf6b3..1b5d169 100644 --- a/__init__.py +++ b/__init__.py @@ -25,6 +25,7 @@ def register(): from . import core from .core import auto_load from .core.logging_setup import configure_logging + from .core.addon_preferences import get_preference # Initialize logging configure_logging(False) @@ -36,6 +37,10 @@ def register(): if not hasattr(bpy.types.Scene, "avatar_toolkit"): from .core.properties import register as register_properties register_properties() + + if hasattr(bpy.types.Scene, "avatar_toolkit"): + log_level = get_preference("log_level", "WARNING") + configure_logging(get_preference("enable_logging", False), log_level) print("Registration complete") diff --git a/core/auto_load.py b/core/auto_load.py index dc326e6..a6ca0ad 100644 --- a/core/auto_load.py +++ b/core/auto_load.py @@ -27,7 +27,8 @@ def init() -> None: configure_logging(False) from .addon_preferences import get_preference - configure_logging(get_preference("enable_logging", False)) + log_level = get_preference("log_level", "WARNING") + configure_logging(get_preference("enable_logging", False), log_level) print("Auto-load init starting") diff --git a/core/logging_setup.py b/core/logging_setup.py index 9e86872..434274d 100644 --- a/core/logging_setup.py +++ b/core/logging_setup.py @@ -6,17 +6,28 @@ from bpy.types import Context logger = logging.getLogger('avatar_toolkit') _original_error = logger.error -def configure_logging(enabled: bool = False) -> None: - """Configure logging for Avatar Toolkit""" - logger.setLevel(logging.DEBUG if enabled else logging.WARNING) +def configure_logging(enabled: bool = False, level: str = "WARNING") -> None: + """Configure logging for Avatar Toolkit """ + level_map = { + "DEBUG": logging.DEBUG, + "INFO": logging.INFO, + "WARNING": logging.WARNING, + "ERROR": logging.ERROR + } + + log_level = level_map.get(level, logging.WARNING) + + if enabled: + logger.setLevel(log_level) + else: + logger.setLevel(logging.ERROR) # We should still log errors when logging is disabled so we don't have silent failures - # Remove existing handlers for handler in logger.handlers[:]: logger.removeHandler(handler) if enabled: handler = logging.StreamHandler() - handler.setLevel(logging.DEBUG) + handler.setLevel(log_level) formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') handler.setFormatter(formatter) logger.addHandler(handler) @@ -34,12 +45,6 @@ def update_logging_state(self: Any, context: Context) -> None: """Update logging state based on user preference""" from .addon_preferences import save_preference enabled = self.enable_logging + level = self.log_level if hasattr(self, "log_level") else "WARNING" save_preference("enable_logging", enabled) - configure_logging(enabled) - -def highlight_problem_bones(self: Any, context: Context) -> None: - """Log when problem bones are highlighted""" - from .addon_preferences import save_preference - enabled = self.highlight_problem_bones - save_preference("highlight_problem_bones", enabled) - logger.debug(f"Problem bone highlighting {'enabled' if enabled else 'disabled'}") + configure_logging(enabled, level) diff --git a/core/properties.py b/core/properties.py index 898a6dc..ef9243d 100644 --- a/core/properties.py +++ b/core/properties.py @@ -43,6 +43,13 @@ def update_logging_state(self: PropertyGroup, context: Context) -> None: from .logging_setup import configure_logging configure_logging(self.enable_logging) +def update_log_level(self: PropertyGroup, context: Context) -> None: + """Updates log level and configures logging""" + logger.info(f"Updating log level to: {self.log_level}") + save_preference("log_level", self.log_level) + from .logging_setup import configure_logging + configure_logging(self.enable_logging, self.log_level) + def update_shape_intensity(self: PropertyGroup, context: Context) -> None: """Updates shape key intensity and refreshes preview""" @@ -588,6 +595,19 @@ class AvatarToolkitSceneProperties(PropertyGroup): default=True ) + log_level: EnumProperty( + name=t("Settings.log_level"), + description=t("Settings.log_level_desc"), + items=[ + ('DEBUG', t("Settings.log_level.debug"), t("Settings.log_level.debug_desc")), + ('INFO', t("Settings.log_level.info"), t("Settings.log_level.info_desc")), + ('WARNING', t("Settings.log_level.warning"), t("Settings.log_level.warning_desc")), + ('ERROR', t("Settings.log_level.error"), t("Settings.log_level.error_desc")), + ], + default=get_preference("log_level", "WARNING"), + update=update_log_level + ) + def register() -> None: """Register the Avatar Toolkit property group""" logger.info("Registering Avatar Toolkit properties") diff --git a/resources/translations/en_US.json b/resources/translations/en_US.json index e29ef01..f8c0517 100644 --- a/resources/translations/en_US.json +++ b/resources/translations/en_US.json @@ -526,6 +526,16 @@ "Settings.highlight_problem_bones": "Highlight Problem Bones", "Settings.highlight_problem_bones_desc": "Highlight bones with validation issues in the viewport", "Settings.bone_highlighting": "Bone Highlighting", + "Settings.log_level": "Log Level", + "Settings.log_level_desc": "Select the detail level for debug logging", + "Settings.log_level.debug": "Debug", + "Settings.log_level.debug_desc": "Show all log messages including detailed debug information", + "Settings.log_level.info": "Info", + "Settings.log_level.info_desc": "Show informational messages, warnings and errors", + "Settings.log_level.warning": "Warning", + "Settings.log_level.warning_desc": "Show only warnings and errors", + "Settings.log_level.error": "Error", + "Settings.log_level.error_desc": "Show only error messages", "Language.auto": "Automatic", "Language.en_US": "English", "Language.ja_JP": "Japanese", diff --git a/resources/translations/ja_JP.json b/resources/translations/ja_JP.json index 22282b0..a37a9a9 100644 --- a/resources/translations/ja_JP.json +++ b/resources/translations/ja_JP.json @@ -514,6 +514,16 @@ "Settings.highlight_problem_bones": "問題のあるボーンを強調表示", "Settings.highlight_problem_bones_desc": "ビューポートで検証に問題のあるボーンを強調表示", "Settings.bone_highlighting": "ボーンの強調表示", + "Settings.log_level": "ログレベル", + "Settings.log_level_desc": "デバッグログの詳細レベルを選択", + "Settings.log_level.debug": "デバッグ", + "Settings.log_level.debug_desc": "詳細なデバッグ情報を含むすべてのログメッセージを表示", + "Settings.log_level.info": "情報", + "Settings.log_level.info_desc": "情報メッセージ、警告、エラーを表示", + "Settings.log_level.warning": "警告", + "Settings.log_level.warning_desc": "警告とエラーのみを表示", + "Settings.log_level.error": "エラー", + "Settings.log_level.error_desc": "エラーメッセージのみを表示", "Language.auto": "自動", "Language.en_US": "英語", "Language.ja_JP": "日本語", diff --git a/resources/translations/ko_KR.json b/resources/translations/ko_KR.json index f80a09d..c8408cc 100644 --- a/resources/translations/ko_KR.json +++ b/resources/translations/ko_KR.json @@ -514,6 +514,16 @@ "Settings.highlight_problem_bones": "문제 본 강조 표시", "Settings.highlight_problem_bones_desc": "뷰포트에서 검증 문제가 있는 본 강조 표시", "Settings.bone_highlighting": "본 강조 표시", + "Settings.log_level": "로그 레벨", + "Settings.log_level_desc": "디버그 로깅의 상세 수준 선택", + "Settings.log_level.debug": "디버그", + "Settings.log_level.debug_desc": "상세한 디버그 정보를 포함한 모든 로그 메시지 표시", + "Settings.log_level.info": "정보", + "Settings.log_level.info_desc": "정보 메시지, 경고 및 오류 표시", + "Settings.log_level.warning": "경고", + "Settings.log_level.warning_desc": "경고 및 오류만 표시", + "Settings.log_level.error": "오류", + "Settings.log_level.error_desc": "오류 메시지만 표시", "Language.auto": "자동", "Language.en_US": "영어", "Language.ja_JP": "일본어", diff --git a/ui/settings_panel.py b/ui/settings_panel.py index 0036ef6..bdaa783 100644 --- a/ui/settings_panel.py +++ b/ui/settings_panel.py @@ -89,3 +89,6 @@ class AvatarToolKit_PT_SettingsPanel(Panel): if props.debug_expand: col = debug_box.column(align=True) col.prop(props, "enable_logging") + + if props.enable_logging: + col.prop(props, "log_level") \ No newline at end of file