diff --git a/moonraker/components/application.py b/moonraker/components/application.py index 8099b30..08a3218 100644 --- a/moonraker/components/application.py +++ b/moonraker/components/application.py @@ -318,10 +318,9 @@ class MoonrakerApp: svr.listen(port, address) except Exception as e: svr_type = "HTTPS" if "ssl_options" in args else "HTTP" - logging.exception(f"{svr_type} Server Start Failed") self.server.add_warning( f"Failed to start {svr_type} server: {e}. See moonraker.log " - "for more details." + "for more details.", exc_info=e ) return None return svr diff --git a/moonraker/components/button.py b/moonraker/components/button.py index b244228..4a7776e 100644 --- a/moonraker/components/button.py +++ b/moonraker/components/button.py @@ -31,7 +31,7 @@ class ButtonManager: btn = GpioButton(cfg) except Exception as e: msg = f"Failed to load button [{cfg.get_name()}]\n{e}" - self.server.add_warning(msg) + self.server.add_warning(msg, exc_info=e) continue self.buttons[btn.name] = btn self.server.register_notification("button:button_event") diff --git a/moonraker/components/file_manager/file_manager.py b/moonraker/components/file_manager/file_manager.py index 9fa4f59..392da60 100644 --- a/moonraker/components/file_manager/file_manager.py +++ b/moonraker/components/file_manager/file_manager.py @@ -1849,12 +1849,11 @@ class InotifyObserver(BaseFileSystemObserver): old_root.clear_events() try: root_node = InotifyRootNode(self, root, root_path) - except Exception: - logging.exception(f"Inotify: failed to create root node '{root}'") + except Exception as e: self.server.add_warning( f"file_manager: Failed to create inotify root node {root}. " "See moonraker.log for details.", - log=False + exc_info=e ) return self.watched_roots[root] = root_node @@ -1877,12 +1876,11 @@ class InotifyObserver(BaseFileSystemObserver): for root, node in self.watched_roots.items(): try: evts = node.scan_node() - except Exception: - logging.exception(f"Inotify: failed to scan root '{root}'") + except Exception as e: self.server.add_warning( f"file_manager: Failed to scan inotify root node '{root}'. " "See moonraker.log for details.", - log=False + exc_info=e ) continue if not evts: diff --git a/moonraker/components/machine.py b/moonraker/components/machine.py index 5bd2603..e44b735 100644 --- a/moonraker/components/machine.py +++ b/moonraker/components/machine.py @@ -1712,8 +1712,7 @@ class InstallValidator: except Exception as e: has_error = True msg = f"Failed to validate {name}: {e}" - logging.exception(msg) - self.server.add_warning(msg, log=False) + self.server.add_warning(msg, exc_info=e) fm.disable_write_access() else: self.validation_enabled = False diff --git a/moonraker/components/notifier.py b/moonraker/components/notifier.py index 7f01296..719106c 100644 --- a/moonraker/components/notifier.py +++ b/moonraker/components/notifier.py @@ -46,7 +46,7 @@ class Notifier: logging.info(f"Registered notifier: '{notifier.get_name()}'") except Exception as e: msg = f"Failed to load notifier[{cfg.get_name()}]\n{e}" - self.server.add_warning(msg) + self.server.add_warning(msg, exc_info=e) continue self.notifiers[notifier.get_name()] = notifier @@ -170,12 +170,12 @@ class NotifierInstance: fm: FileManager = self.server.lookup_component("file_manager") try: rendered = self.attach.render(context) - except self.server.error: - logging.exception(f"notifier {self.name}: Failed to render attachment") + except self.server.error as e: self.server.add_warning( f"[notifier {self.name}]: The attachment is not valid. The " "template failed to render.", - f"notifier {self.name}" + f"notifier {self.name}", + exc_info=e ) self.attach = None else: diff --git a/moonraker/components/power.py b/moonraker/components/power.py index 0ff0119..f698dd0 100644 --- a/moonraker/components/power.py +++ b/moonraker/components/power.py @@ -74,7 +74,7 @@ class PrinterPower: dev = dev_class(cfg) except Exception as e: msg = f"Failed to load power device [{cfg.get_name()}]\n{e}" - self.server.add_warning(msg) + self.server.add_warning(msg, exc_info=e) continue self.devices[dev.get_name()] = dev diff --git a/moonraker/components/sensor.py b/moonraker/components/sensor.py index 4b3bcdb..81cdf8b 100644 --- a/moonraker/components/sensor.py +++ b/moonraker/components/sensor.py @@ -267,7 +267,7 @@ class Sensors: except Exception as e: # Ensures that configuration errors are shown to the user self.server.add_warning( - f"Failed to configure sensor [{cfg.get_name()}]\n{e}" + f"Failed to configure sensor [{cfg.get_name()}]\n{e}", exc_info=e ) continue diff --git a/moonraker/components/update_manager/update_manager.py b/moonraker/components/update_manager/update_manager.py index 4c8fc66..b934cc4 100644 --- a/moonraker/components/update_manager/update_manager.py +++ b/moonraker/components/update_manager/update_manager.py @@ -130,7 +130,8 @@ class UpdateManager: self.updaters[name] = deployer(cfg, self.cmd_helper) except Exception as e: self.server.add_warning( - f"[update_manager]: Failed to load extension {name}: {e}" + f"[update_manager]: Failed to load extension {name}: {e}", + exc_info=e ) self.cmd_request_lock = asyncio.Lock() diff --git a/moonraker/components/wled.py b/moonraker/components/wled.py index ea758e0..f65a2a6 100644 --- a/moonraker/components/wled.py +++ b/moonraker/components/wled.py @@ -377,7 +377,7 @@ class WLED: except Exception as e: # Ensures errors such as "Color not supported" are visible msg = f"Failed to initialise strip [{cfg.get_name()}]\n{e}" - self.server.add_warning(msg) + self.server.add_warning(msg, exc_info=e) continue # Register two remote methods for GCODE diff --git a/moonraker/server.py b/moonraker/server.py index ccd1c39..86c2cba 100755 --- a/moonraker/server.py +++ b/moonraker/server.py @@ -226,13 +226,17 @@ class Server: logging.info(item) def add_warning( - self, warning: str, warn_id: Optional[str] = None, log: bool = True + self, + warning: str, + warn_id: Optional[str] = None, + log: bool = True, + exc_info: Optional[BaseException] = None ) -> str: if warn_id is None: warn_id = str(id(warning)) self.warnings[warn_id] = warning if log: - logging.warning(warning) + logging.warning(warning, exc_info=exc_info) return warn_id def remove_warning(self, warn_id: str) -> None: @@ -246,9 +250,9 @@ class Server: if ret is not None: await ret except Exception as e: - logging.exception(f"Component [{name}] failed post init") - self.add_warning(f"Component '{name}' failed to load with " - f"error: {e}") + self.add_warning( + f"Component '{name}' failed to load with error: {e}", exc_info=e + ) self.set_failed_component(name) def load_components(self) -> None: