From 4940a19c5000cb02dfaa0dd4627cf361fcdcb772 Mon Sep 17 00:00:00 2001 From: Jeremiah K <17190268+jeremiah-k@users.noreply.github.com> Date: Sat, 23 Nov 2024 17:47:01 -0600 Subject: [PATCH 1/5] map_plugin - fix bare excepts, add logging --- plugins/map_plugin.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/plugins/map_plugin.py b/plugins/map_plugin.py index 47895de..4c2756c 100644 --- a/plugins/map_plugin.py +++ b/plugins/map_plugin.py @@ -6,11 +6,13 @@ import s2sphere import staticmaps +from log_utils import get_logger from nio import AsyncClient, UploadResponse from PIL import Image, ImageFont from plugins.base_plugin import BasePlugin +logger = get_logger(__name__) class TextLabel(staticmaps.Object): def __init__(self, latlng: s2sphere.LatLng, text: str, fontSize: int = 12) -> None: @@ -53,7 +55,8 @@ def render_pillow(self, renderer: staticmaps.PillowRenderer) -> None: try: font = ImageFont.truetype(path, self._font_size) break - except Exception: + except OSError: + logger.warning(f"Failed to load font from {path}") pass if not font: @@ -281,7 +284,7 @@ async def handle_room_message(self, room, event, full_message): try: zoom = int(zoom) - except: + except ValueError: zoom = self.config.get("zoom", 13) if zoom < 0 or zoom > 30: @@ -289,7 +292,7 @@ async def handle_room_message(self, room, event, full_message): try: image_size = (int(image_size[0]), int(image_size[1])) - except: + except (ValueError, TypeError): image_size = ( self.config.get("image_width", 1000), self.config.get("image_height", 1000), From 28fb36a3e613c62ed7bb34029d64c39a1bbcde34 Mon Sep 17 00:00:00 2001 From: Jeremiah K <17190268+jeremiah-k@users.noreply.github.com> Date: Sat, 23 Nov 2024 18:05:02 -0600 Subject: [PATCH 2/5] Add an option to log to file --- log_utils.py | 32 +++++++++++++++++++++++++------- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/log_utils.py b/log_utils.py index 38c3c51..269e8e3 100644 --- a/log_utils.py +++ b/log_utils.py @@ -1,21 +1,39 @@ import logging - +import os from config import relay_config - def get_logger(name): logger = logging.getLogger(name=name) log_level = getattr(logging, relay_config["logging"]["level"].upper()) - logger.setLevel(log_level) - logger.propagate = False # Add this line to prevent double logging + logger.propagate = False - handler = logging.StreamHandler() - handler.setFormatter( + # Add stream handler (console logging) + stream_handler = logging.StreamHandler() + stream_handler.setFormatter( logging.Formatter( fmt="%(asctime)s %(levelname)s:%(name)s:%(message)s", datefmt="%Y-%m-%d %H:%M:%S %z", ) ) - logger.addHandler(handler) + logger.addHandler(stream_handler) + + # Check if file logging is enabled + if relay_config["logging"].get("log_to_file", False): + # Default to `mmrelay.log` if no filename is provided + log_file = relay_config["logging"].get("filename", "mmrelay.log") + + # Ensure directory exists + os.makedirs(os.path.dirname(log_file), exist_ok=True) + + # Add file handler + file_handler = logging.FileHandler(log_file) + file_handler.setFormatter( + logging.Formatter( + fmt="%(asctime)s %(levelname)s:%(name)s:%(message)s", + datefmt="%Y-%m-%d %H:%M:%S %z", + ) + ) + logger.addHandler(file_handler) + return logger From 350329edbd09b31763fddf46d7d25f17dba793e1 Mon Sep 17 00:00:00 2001 From: Jeremiah K <17190268+jeremiah-k@users.noreply.github.com> Date: Sat, 23 Nov 2024 18:09:37 -0600 Subject: [PATCH 3/5] Update .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 0ecf2d9..cc3e72a 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,7 @@ plugins/__pycache__/ *.pyd *$py.class custom_plugins/ +mmrelay.log plugins/custom/* plugins/community/* From abab9879519584bb4afa1db5081cdfada7c4d493 Mon Sep 17 00:00:00 2001 From: Jeremiah K <17190268+jeremiah-k@users.noreply.github.com> Date: Sat, 23 Nov 2024 18:19:45 -0600 Subject: [PATCH 4/5] Add log rotation options --- .gitignore | 2 +- log_utils.py | 19 +++++++++++++------ sample_config.yaml | 5 +++++ 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/.gitignore b/.gitignore index cc3e72a..2b4bcd6 100644 --- a/.gitignore +++ b/.gitignore @@ -10,7 +10,7 @@ plugins/__pycache__/ *.pyd *$py.class custom_plugins/ -mmrelay.log +logs/* plugins/custom/* plugins/community/* diff --git a/log_utils.py b/log_utils.py index 269e8e3..c8f3ac5 100644 --- a/log_utils.py +++ b/log_utils.py @@ -1,5 +1,6 @@ import logging import os +from logging.handlers import RotatingFileHandler from config import relay_config def get_logger(name): @@ -20,14 +21,20 @@ def get_logger(name): # Check if file logging is enabled if relay_config["logging"].get("log_to_file", False): - # Default to `mmrelay.log` if no filename is provided - log_file = relay_config["logging"].get("filename", "mmrelay.log") + # Default to `logs/mmrelay.log` if no filename is provided + log_file = relay_config["logging"].get("filename", "logs/mmrelay.log") - # Ensure directory exists - os.makedirs(os.path.dirname(log_file), exist_ok=True) + # Only create directories if the path is not the default + if log_file != "logs/mmrelay.log": + log_dir = os.path.dirname(log_file) + if log_dir: # Ensure non-empty directory paths exist + os.makedirs(log_dir, exist_ok=True) + + # Set up size-based log rotation + max_bytes = relay_config["logging"].get("max_log_size", 10 * 1024 * 1024) # Default 10 MB + backup_count = relay_config["logging"].get("backup_count", 5) # Default to 5 backups + file_handler = RotatingFileHandler(log_file, maxBytes=max_bytes, backupCount=backup_count) - # Add file handler - file_handler = logging.FileHandler(log_file) file_handler.setFormatter( logging.Formatter( fmt="%(asctime)s %(levelname)s:%(name)s:%(message)s", diff --git a/sample_config.yaml b/sample_config.yaml index 7167781..bf8ec84 100644 --- a/sample_config.yaml +++ b/sample_config.yaml @@ -20,6 +20,10 @@ meshtastic: logging: level: info + log_to_file: true + filename: logs/mmrelay.log # Default location + max_log_size: 10485760 # 10 MB (default if omitted) + backup_count: 5 # Keep 5 backups (default if omitted) #Note: Some plugins are experimental and some need maintenance. plugins: @@ -28,6 +32,7 @@ plugins: nodes: active: true # Other core plugins.. + #community-plugins: # Note: Community plugins are a new feature. Please report any issues. # sample_plugin: # active: true From 3fe87d2877677da1d94734c06a8d67a15d630595 Mon Sep 17 00:00:00 2001 From: Jeremiah K <17190268+jeremiah-k@users.noreply.github.com> Date: Sat, 23 Nov 2024 18:21:33 -0600 Subject: [PATCH 5/5] Update .gitignore --- .gitignore | 1 + logs/.gitkeep | 0 2 files changed, 1 insertion(+) create mode 100644 logs/.gitkeep diff --git a/.gitignore b/.gitignore index 2b4bcd6..dc58055 100644 --- a/.gitignore +++ b/.gitignore @@ -15,5 +15,6 @@ plugins/custom/* plugins/community/* # Allow the directories themselves to be tracked +!logs/.gitkeep !plugins/custom/.gitkeep !plugins/community/.gitkeep \ No newline at end of file diff --git a/logs/.gitkeep b/logs/.gitkeep new file mode 100644 index 0000000..e69de29