diff --git a/unifi_protect_backup/downloader.py b/unifi_protect_backup/downloader.py index 2fe0ba8..eedcde0 100644 --- a/unifi_protect_backup/downloader.py +++ b/unifi_protect_backup/downloader.py @@ -19,9 +19,6 @@ from unifi_protect_backup.utils import ( setup_event_logger, ) -logger = logging.getLogger(__name__) -setup_event_logger(logger) - async def get_video_length(video: bytes) -> float: """Uses ffprobe to get the length of the video file passed in as a byte stream""" @@ -39,13 +36,18 @@ async def get_video_length(video: bytes) -> float: class VideoDownloader: """Downloads event video clips from Unifi Protect""" - def __init__(self, protect: ProtectApiClient, download_queue: asyncio.Queue, upload_queue: VideoQueue): + def __init__( + self, protect: ProtectApiClient, download_queue: asyncio.Queue, upload_queue: VideoQueue, color_logging: bool + ): self._protect: ProtectApiClient = protect self.download_queue: asyncio.Queue = download_queue self.upload_queue: VideoQueue = upload_queue - self.logger = logging.LoggerAdapter(logger, {'event': ''}) self.current_event = None + self.base_logger = logging.getLogger(__name__) + setup_event_logger(self.base_logger, color_logging) + self.logger = logging.LoggerAdapter(self.base_logger, {'event': ''}) + # Check if `ffprobe` is available ffprobe = shutil.which('ffprobe') if ffprobe is not None: @@ -61,7 +63,7 @@ class VideoDownloader: try: event = await self.download_queue.get() self.current_event = event - self.logger = logging.LoggerAdapter(logger, {'event': f' [{event.id}]'}) + self.logger = logging.LoggerAdapter(self.base_logger, {'event': f' [{event.id}]'}) # Fix timezones since pyunifiprotect sets all timestamps to UTC. Instead localize them to # the timezone of the unifi protect NVR. diff --git a/unifi_protect_backup/unifi_protect_backup_core.py b/unifi_protect_backup/unifi_protect_backup_core.py index c433749..9fc9d2b 100644 --- a/unifi_protect_backup/unifi_protect_backup_core.py +++ b/unifi_protect_backup/unifi_protect_backup_core.py @@ -99,7 +99,8 @@ class UnifiProtectBackup: for notifier in apprise_notifiers: notifications.add_notification_service(notifier) - setup_logging(verbose, color_logging) + self.color_logging = color_logging + setup_logging(verbose, self.color_logging) logger.debug("Config:") logger.debug(f" {address=}") @@ -204,7 +205,7 @@ class UnifiProtectBackup: # Create downloader task # This will download video files to its buffer - downloader = VideoDownloader(self._protect, download_queue, upload_queue) + downloader = VideoDownloader(self._protect, download_queue, upload_queue, self.color_logging) tasks.append(asyncio.create_task(downloader.start())) # Create upload task @@ -216,6 +217,7 @@ class UnifiProtectBackup: self.rclone_args, self.file_structure_format, self._db, + self.color_logging, ) tasks.append(asyncio.create_task(uploader.start())) diff --git a/unifi_protect_backup/uploader.py b/unifi_protect_backup/uploader.py index 26a7e36..fd4b730 100644 --- a/unifi_protect_backup/uploader.py +++ b/unifi_protect_backup/uploader.py @@ -10,9 +10,6 @@ from pyunifiprotect import ProtectApiClient from unifi_protect_backup.utils import get_camera_name, VideoQueue, run_command, setup_event_logger, human_readable_size -logger = logging.getLogger(__name__) -setup_event_logger(logger) - class VideoUploader: """Uploads videos from the video_queue to the provided rclone destination @@ -28,6 +25,7 @@ class VideoUploader: rclone_args: str, file_structure_format: str, db: aiosqlite.Connection, + color_logging: bool, ): self._protect: ProtectApiClient = protect self.upload_queue: VideoQueue = upload_queue @@ -35,9 +33,12 @@ class VideoUploader: self._rclone_args: str = rclone_args self._file_structure_format: str = file_structure_format self._db: aiosqlite.Connection = db - self.logger = logging.LoggerAdapter(logger, {'event': ''}) self.current_event = None + self.base_logger = logging.getLogger(__name__) + setup_event_logger(self.base_logger, color_logging) + self.logger = logging.LoggerAdapter(self.base_logger, {'event': ''}) + async def start(self): """Main loop @@ -50,7 +51,7 @@ class VideoUploader: event, video = await self.upload_queue.get() self.current_event = event - self.logger = logging.LoggerAdapter(logger, {'event': f' [{event.id}]'}) + self.logger = logging.LoggerAdapter(self.base_logger, {'event': f' [{event.id}]'}) self.logger.info(f"Uploading event: {event.id}") self.logger.debug( diff --git a/unifi_protect_backup/utils.py b/unifi_protect_backup/utils.py index fa4679c..710e2b5 100644 --- a/unifi_protect_backup/utils.py +++ b/unifi_protect_backup/utils.py @@ -152,11 +152,11 @@ class AppriseStreamHandler(logging.StreamHandler): self.handleError(record) -def create_logging_handler(format): + +def create_logging_handler(format, color_logging): date_format = "%Y-%m-%d %H:%M:%S" style = '{' - global color_logging sh = AppriseStreamHandler(color_logging) formatter = logging.Formatter(format, date_format, style) sh.setFormatter(formatter) @@ -183,8 +183,6 @@ def setup_logging(verbosity: int, color_logging: bool = False, apprise_notifiers apprise_notifiers (List[str]): Notification services to hook into the logger """ - globals()['color_logging'] = color_logging - add_logging_level( 'EXTRA_DEBUG', logging.DEBUG - 1, @@ -195,7 +193,7 @@ def setup_logging(verbosity: int, color_logging: bool = False, apprise_notifiers ) format = "{asctime} [{levelname:^11s}] {name:<42} : {message}" - sh = create_logging_handler(format) + sh = create_logging_handler(format, color_logging) logger = logging.getLogger("unifi_protect_backup") logger.addHandler(sh) @@ -221,9 +219,9 @@ def setup_logging(verbosity: int, color_logging: bool = False, apprise_notifiers logger.setLevel(logging.WEBSOCKET_DATA) # type: ignore -def setup_event_logger(logger): +def setup_event_logger(logger, color_logging): format = "{asctime} [{levelname:^11s}] {name:<42} :{event} {message}" - sh = create_logging_handler(format) + sh = create_logging_handler(format, color_logging) logger.addHandler(sh) logger.propagate = False