Make the logging less verbose for errors (#1118)
authorMarcel van der Veldt <m.vanderveldt@outlook.com>
Tue, 27 Feb 2024 08:26:58 +0000 (09:26 +0100)
committerGitHub <noreply@github.com>
Tue, 27 Feb 2024 08:26:58 +0000 (09:26 +0100)
Only print stack traces if debug level enabled

15 files changed:
music_assistant/server/controllers/cache.py
music_assistant/server/controllers/metadata.py
music_assistant/server/controllers/music.py
music_assistant/server/controllers/players.py
music_assistant/server/controllers/webserver.py
music_assistant/server/providers/dlna/__init__.py
music_assistant/server/providers/fanarttv/__init__.py
music_assistant/server/providers/filesystem_local/base.py
music_assistant/server/providers/qobuz/__init__.py
music_assistant/server/providers/sonos/__init__.py
music_assistant/server/providers/sonos/player.py
music_assistant/server/providers/spotify/__init__.py
music_assistant/server/providers/theaudiodb/__init__.py
music_assistant/server/server.py
pyproject.toml

index 3523ebaa245d25a90a0725ecb5dac0808a470c41..a375ec65fb5a4d65108232381dae08add452c4af 100644 (file)
@@ -104,7 +104,12 @@ class CacheController(CoreController):
             try:
                 data = await asyncio.to_thread(json_loads, db_row["data"])
             except Exception as exc:  # pylint: disable=broad-except
-                LOGGER.exception("Error parsing cache data for %s", cache_key, exc_info=exc)
+                LOGGER.error(
+                    "Error parsing cache data for %s: %s",
+                    cache_key,
+                    str(exc),
+                    exc_info=exc if self.logger.isEnabledFor(10) else None,
+                )
             else:
                 # also store in memory cache for faster access
                 self._mem_cache[cache_key] = (
index 0e8bc06c010e1646f6ffdc3fb71602942c1702a6..42e520468869b8beb1764ea5ab4c37e4da1f87af 100644 (file)
@@ -226,7 +226,11 @@ class MetaDataController(CoreController):
                     MediaItemImage(type=ImageType.THUMB, path=img_path, provider="file")
                 ]
         except Exception as err:
-            LOGGER.debug("Error while creating playlist image", exc_info=err)
+            LOGGER.warning(
+                "Error while creating playlist image: %s",
+                str(err),
+                exc_info=err if self.logger.isEnabledFor(10) else None,
+            )
         # set timestamp, used to determine when this function was last called
         playlist.metadata.last_refresh = int(time())
 
index 5dc0f3048c9e10bbad00a486713ab139401644e9..413948536c8e262d02049a2ee9ef6867ccacbd6b 100644 (file)
@@ -601,7 +601,7 @@ class MusicController(CoreController):
                 self.logger.warning(
                     "Sync task for %s completed with errors",
                     provider.name,
-                    exc_info=task_err,
+                    exc_info=task_err if self.logger.isEnabledFor(10) else None,
                 )
             else:
                 self.logger.info("Sync task for %s completed", provider.name)
index 748a05b973a44e0417651dc9e2b6c463fd394490..58171ae66649213bf164bd3cb40a266ca88f3551 100644 (file)
@@ -875,7 +875,7 @@ class PlayerController(CoreController):
                             "Error while requesting latest state from player %s: %s",
                             player.display_name,
                             str(err),
-                            exc_info=err,
+                            exc_info=err if self.logger.isEnabledFor(10) else None,
                         )
                     finally:
                         # always update player state
index 10cbf285e4a34f419ce4f2eecd4b8bae4f5df46f..507f42d52c973c11d40e513811ef27fa75fde7a8 100644 (file)
@@ -248,6 +248,7 @@ class WebsocketClientHandler:
         self._to_write: asyncio.Queue = asyncio.Queue(maxsize=MAX_PENDING_MSG)
         self._handle_task: asyncio.Task | None = None
         self._writer_task: asyncio.Task | None = None
+        self.log_level = webserver.log_level
         self._logger = WebSocketLogAdapter(webserver.logger, {"connid": id(self)})
 
     async def disconnect(self) -> None:
@@ -374,7 +375,10 @@ class WebsocketClientHandler:
                 result = await result
             self._send_message(SuccessResultMessage(msg.message_id, result))
         except Exception as err:  # pylint: disable=broad-except
-            self._logger.exception("Error handling message: %s", msg)
+            if self.log_level == "VERBOSE":
+                self._logger.exception("Error handling message: %s", msg)
+            else:
+                self._logger.error("Error handling message: %s: %s", msg.command, str(err))
             self._send_message(
                 ErrorResultMessage(msg.message_id, getattr(err, "error_code", 999), str(err))
             )
@@ -407,7 +411,7 @@ class WebsocketClientHandler:
         try:
             self._to_write.put_nowait(_message)
         except asyncio.QueueFull:
-            self._logger.exception("Client exceeded max pending messages: %s", MAX_PENDING_MSG)
+            self._logger.error("Client exceeded max pending messages: %s", MAX_PENDING_MSG)
 
             self._cancel()
 
index b5c8b6a7e7bfc60408a3e12d098466aad399fb6a..d0b6ade9542eb35db7c46005c5fa975098e6fcf6 100644 (file)
@@ -167,7 +167,10 @@ def catch_request_errors(
             return await func(self, *args, **kwargs)
         except UpnpError as err:
             dlna_player.force_poll = True
-            self.logger.exception("Error during call %s: %r", func.__name__, err)
+            if self.log_level == "VERBOSE":
+                self.logger.exception("Error during call %s: %r", func.__name__, err)
+            else:
+                self.logger.error("Error during call %s: %r", func.__name__, str(err))
         return None
 
     return wrapper
index c6455e292be7313d67c260ffd18c71ec538be8ea..7540c38b155d214c1234686e6efd7ec16f68d6b6 100644 (file)
@@ -133,7 +133,7 @@ class FanartTvMetadataProvider(MetadataProvider):
                 aiohttp.client_exceptions.ContentTypeError,
                 JSONDecodeError,
             ):
-                self.logger.exception("Failed to retrieve %s", endpoint)
+                self.logger.error("Failed to retrieve %s", endpoint)
                 text_result = await response.text()
                 self.logger.debug(text_result)
                 return None
index a764a19339ec253e364f84b16c3ec37991c9dce4..c9152fe2665aa64d301d08209bb26d700899a90d 100644 (file)
@@ -356,7 +356,7 @@ class FileSystemProviderBase(MusicProvider):
                     )
             except Exception as err:  # pylint: disable=broad-except
                 # we don't want the whole sync to crash on one file so we catch all exceptions here
-                self.logger.exception("Error processing %s - %s", item.path, str(err))
+                self.logger.error("Error processing %s - %s", item.path, str(err))
 
     async def _process_deletions(self, deleted_files: set[str]) -> None:
         """Process all deletions."""
@@ -504,7 +504,12 @@ class FileSystemProviderBase(MusicProvider):
                     yield media_item
 
         except Exception as err:  # pylint: disable=broad-except
-            self.logger.warning("Error while parsing playlist %s", prov_playlist_id, exc_info=err)
+            self.logger.warning(
+                "Error while parsing playlist %s: %s",
+                prov_playlist_id,
+                str(err),
+                exc_info=err if self.logger.isEnabledFor(10) else None,
+            )
 
     async def _parse_playlist_line(
         self, line: str, playlist_path: str, position: int
index b0a12cea9f302847c2bf4ce959b0b0fdba609423..b0d2b1e5450e300168705228366b69a09b98b93d 100644 (file)
@@ -760,9 +760,9 @@ class QobuzProvider(MusicProvider):
                 JSONDecodeError,
                 AssertionError,
                 ValueError,
-            ) as err:
+            ):
                 text = await response.text()
-                self.logger.exception("Error while processing %s: %s", endpoint, text, exc_info=err)
+                self.logger.error("Error while processing %s: %s", endpoint, text)
                 return None
             return result
 
index 33f3345099917457757ce1fcafb036fbaf1bbcb3..01a677b069ab50e9f8d358cc3ab96b30ee50bd66 100644 (file)
@@ -482,7 +482,10 @@ class SonosPlayerProvider(PlayerProvider):
                         self.logger.debug("Failed to add SonosPlayer %s: %s", soco, err)
                     except Exception as err:
                         self.logger.warning(
-                            "Failed to add SonosPlayer %s: %s", soco, err, exc_info=err
+                            "Failed to add SonosPlayer %s: %s",
+                            soco,
+                            err,
+                            exc_info=err if self.logger.isEnabledFor(10) else None,
                         )
             finally:
                 self._discovery_running = False
index ec542e250dd83258dcdea26f6aac2b4017695978..857575d32d17c73002f9246b0bee303e6e2f04e0 100644 (file)
@@ -238,7 +238,7 @@ class SonosPlayer:
             event,
             self.zone_name,
             message,
-            exc_info=exc_info,
+            exc_info=exc_info if self.logger.isEnabledFor(10) else None,
         )
 
     async def subscribe(self) -> None:
index 5e5cd8aca22805fe5ef4be563813ef01a1fb8c31..4c3152fbb7448b83527000c13b94df9706efea91 100644 (file)
@@ -752,7 +752,7 @@ class SpotifyProvider(MusicProvider):
                 aiohttp.ContentTypeError,
                 JSONDecodeError,
             ):
-                self.logger.exception("Error while processing %s: %s", endpoint, result)
+                self.logger.error("Error while processing %s: %s", endpoint, result)
                 return None
             self.logger.debug(
                 "Processing GET/%s took %s seconds",
index 68d19bc516c8344c57f4eefe097d838d7fc4bcfb..12713ef3fafeff5c9992e2da032db1e83ecd6c05 100644 (file)
@@ -279,7 +279,7 @@ class AudioDbMetadataProvider(MetadataProvider):
                 aiohttp.client_exceptions.ContentTypeError,
                 JSONDecodeError,
             ):
-                self.logger.exception("Failed to retrieve %s", endpoint)
+                self.logger.error("Failed to retrieve %s", endpoint)
                 text_result = await response.text()
                 self.logger.debug(text_result)
                 return None
index 3e8654c5f755cf1f34496cee85926768339e2def..65d92921e3f7ddc01707e835dd7fc56f8ec13767 100644 (file)
@@ -603,7 +603,7 @@ class MusicAssistant:
                 await self.aiozc.async_register_service(info)
             self.mass_zc_service_set = True
         except NonUniqueNameException:
-            LOGGER.exception(
+            LOGGER.error(
                 "Music Assistant instance with identical name present in the local network!"
             )
 
index 458ab3b75361137ad422ec1cf6f9c376e89f0a25..83dcc39382d9663f6be1cdbfa2e579f939937ba9 100644 (file)
@@ -198,6 +198,7 @@ ignore = [
   "TD003", # Just annoying, not really useful
   "TD004", # Just annoying, not really useful
   "TRY003", # Just annoying, not really useful
+  "TRY400", # Just annoying, not really useful
   "COM812", # Conflicts with the Ruff formatter
   "ISC001", # TEMPORARY DISABLED rules  # The below rules must be enabled later one-by-one !
   "BLE001",