Separate AcoustID file logging

- keep AcoustID logs out of app.log
- route client and verification to logs/acoustid.log
- align tag writer with the soulsync logger namespace
This commit is contained in:
Antti Kettunen 2026-04-21 15:48:47 +03:00
parent 8b9284f414
commit 01d118daa6
No known key found for this signature in database
GPG key ID: C6B2A3D250359BD7
4 changed files with 20 additions and 18 deletions

View file

@ -20,6 +20,7 @@ from typing import Dict, List, Optional, Any, Tuple
from pathlib import Path from pathlib import Path
import os import os
import shutil import shutil
import logging
import logging.handlers import logging.handlers
from utils.logging_config import get_logger from utils.logging_config import get_logger
@ -29,22 +30,23 @@ from config.settings import config_manager
FPCALC_BIN_DIR = Path(__file__).parent.parent / "bin" FPCALC_BIN_DIR = Path(__file__).parent.parent / "bin"
CHROMAPRINT_VERSION = "1.5.1" CHROMAPRINT_VERSION = "1.5.1"
# Set up dedicated AcoustID logger with its own file _acoustid_logger = logging.getLogger("soulsync.acoustid")
logger = get_logger("acoustid_client") _acoustid_logger.setLevel(logging.DEBUG)
# Add dedicated file handler for AcoustID logs alongside the configured app log
_acoustid_log_path = Path(config_manager.get('logging.path', 'logs/app.log')).parent / "acoustid.log" _acoustid_log_path = Path(config_manager.get('logging.path', 'logs/app.log')).parent / "acoustid.log"
_acoustid_log_path.parent.mkdir(parents=True, exist_ok=True) _acoustid_log_path.parent.mkdir(parents=True, exist_ok=True)
_acoustid_file_handler = logging.handlers.RotatingFileHandler( if not _acoustid_logger.handlers:
_acoustid_log_path, encoding='utf-8', maxBytes=5*1024*1024, backupCount=2 _acoustid_file_handler = logging.handlers.RotatingFileHandler(
) _acoustid_log_path, encoding='utf-8', maxBytes=5*1024*1024, backupCount=2
_acoustid_file_handler.setLevel(logging.DEBUG) )
_acoustid_file_handler.setFormatter(logging.Formatter( _acoustid_file_handler.setLevel(logging.DEBUG)
fmt='%(asctime)s - %(name)s - %(levelname)s - %(funcName)s:%(lineno)d - %(message)s', _acoustid_file_handler.setFormatter(logging.Formatter(
datefmt='%Y-%m-%d %H:%M:%S' fmt='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
)) datefmt='%Y-%m-%d %H:%M:%S'
logger.addHandler(_acoustid_file_handler) ))
logging.getLogger("soulsync.acoustid_verification").addHandler(_acoustid_file_handler) _acoustid_logger.addHandler(_acoustid_file_handler)
_acoustid_logger.propagate = False
logger = get_logger("acoustid.client")
# Check if pyacoustid is available # Check if pyacoustid is available
try: try:

View file

@ -17,7 +17,7 @@ from utils.logging_config import get_logger
from core.acoustid_client import AcoustIDClient from core.acoustid_client import AcoustIDClient
from core.musicbrainz_client import MusicBrainzClient from core.musicbrainz_client import MusicBrainzClient
logger = get_logger("acoustid_verification") logger = get_logger("acoustid.verification")
# Thresholds # Thresholds
MIN_ACOUSTID_SCORE = 0.80 # Minimum AcoustID fingerprint score to trust MIN_ACOUSTID_SCORE = 0.80 # Minimum AcoustID fingerprint score to trust

View file

@ -16,7 +16,7 @@ from mutagen.mp4 import MP4, MP4Cover, MP4FreeForm
from mutagen.oggvorbis import OggVorbis from mutagen.oggvorbis import OggVorbis
from mutagen.apev2 import APEv2, APENoHeaderError from mutagen.apev2 import APEv2, APENoHeaderError
logger = logging.getLogger("soulsync.tag_writer") logger = logging.getLogger("tag_writer")
# Supported extensions # Supported extensions
SUPPORTED_EXTENSIONS = {'.mp3', '.flac', '.ogg', '.oga', '.opus', '.m4a', '.mp4'} SUPPORTED_EXTENSIONS = {'.mp3', '.flac', '.ogg', '.oga', '.opus', '.m4a', '.mp4'}

View file

@ -6396,8 +6396,8 @@ def get_log_tail():
log_map = { log_map = {
'app': Path(_log_path), 'app': Path(_log_path),
'post_processing': _log_dir / 'post_processing.log',
'acoustid': _log_dir / 'acoustid.log', 'acoustid': _log_dir / 'acoustid.log',
'post_processing': _log_dir / 'post_processing.log',
'source_reuse': _log_dir / 'source_reuse.log', 'source_reuse': _log_dir / 'source_reuse.log',
} }
log_path = log_map.get(log_source, log_map['app']) log_path = log_map.get(log_source, log_map['app'])
@ -54425,8 +54425,8 @@ def _emit_live_log_loop():
_active_source = 'app' _active_source = 'app'
log_map = { log_map = {
'app': Path(_log_path), 'app': Path(_log_path),
'post_processing': _log_dir / 'post_processing.log',
'acoustid': _log_dir / 'acoustid.log', 'acoustid': _log_dir / 'acoustid.log',
'post_processing': _log_dir / 'post_processing.log',
'source_reuse': _log_dir / 'source_reuse.log', 'source_reuse': _log_dir / 'source_reuse.log',
} }
while not globals().get('IS_SHUTTING_DOWN', False): while not globals().get('IS_SHUTTING_DOWN', False):