refactor(logging): standardize logging approach across services and steps
This commit is contained in:
@@ -17,7 +17,7 @@ import pytz
|
||||
from services.exceptions import LockAcquisitionError, SyncError, ValidationError
|
||||
from services.redis_client import get_redis_client
|
||||
from services.config import SYNC_CONFIG, get_lock_key, get_retry_delay_seconds
|
||||
from services.logging_utils import get_logger
|
||||
from services.logging_utils import get_service_logger
|
||||
|
||||
import redis
|
||||
|
||||
@@ -31,7 +31,7 @@ class BeteiligteSync:
|
||||
def __init__(self, espocrm_api, redis_client: Optional[redis.Redis] = None, context=None):
|
||||
self.espocrm = espocrm_api
|
||||
self.context = context
|
||||
self.logger = get_logger('beteiligte_sync', context)
|
||||
self.logger = get_service_logger('beteiligte_sync', context)
|
||||
|
||||
# Use provided Redis client or get from factory
|
||||
self.redis = redis_client or get_redis_client(strict=False)
|
||||
@@ -46,6 +46,11 @@ class BeteiligteSync:
|
||||
from services.notification_utils import NotificationManager
|
||||
self.notification_manager = NotificationManager(espocrm_api=self.espocrm, context=context)
|
||||
|
||||
def _log(self, message: str, level: str = 'info') -> None:
|
||||
"""Delegate logging to the logger with optional level"""
|
||||
log_func = getattr(self.logger, level, self.logger.info)
|
||||
log_func(message)
|
||||
|
||||
async def acquire_sync_lock(self, entity_id: str) -> bool:
|
||||
"""
|
||||
Atomic distributed lock via Redis + syncStatus update
|
||||
|
||||
@@ -10,12 +10,9 @@ Hilfsfunktionen für Document-Synchronisation mit xAI:
|
||||
|
||||
from typing import Dict, Any, Optional, List, Tuple
|
||||
from datetime import datetime, timedelta
|
||||
import logging
|
||||
|
||||
from services.sync_utils_base import BaseSyncUtils
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
# Max retry before permanent failure
|
||||
MAX_SYNC_RETRIES = 5
|
||||
|
||||
|
||||
@@ -5,6 +5,59 @@ Vereinheitlicht Logging über:
|
||||
- Standard Python Logger
|
||||
- Motia FlowContext Logger
|
||||
- Structured Logging
|
||||
|
||||
Usage Guidelines:
|
||||
=================
|
||||
|
||||
FOR SERVICES: Use get_service_logger('service_name', context)
|
||||
-----------------------------------------------------------------
|
||||
Example:
|
||||
from services.logging_utils import get_service_logger
|
||||
|
||||
class XAIService:
|
||||
def __init__(self, ctx=None):
|
||||
self.logger = get_service_logger('xai', ctx)
|
||||
|
||||
def upload(self):
|
||||
self.logger.info("Uploading file...")
|
||||
|
||||
FOR STEPS: Use ctx.logger directly (preferred)
|
||||
-----------------------------------------------------------------
|
||||
Steps already have ctx.logger available - use it directly:
|
||||
async def handler(event_data, ctx: FlowContext):
|
||||
ctx.logger.info("Processing event")
|
||||
|
||||
Alternative: Use get_step_logger() for additional loggers:
|
||||
step_logger = get_step_logger('beteiligte_sync', ctx)
|
||||
|
||||
FOR SYNC UTILS: Inherit from BaseSyncUtils (provides self.logger)
|
||||
-----------------------------------------------------------------
|
||||
from services.sync_utils_base import BaseSyncUtils
|
||||
|
||||
class MySync(BaseSyncUtils):
|
||||
def __init__(self, espocrm, redis, context):
|
||||
super().__init__(espocrm, redis, context)
|
||||
# self.logger is now available
|
||||
|
||||
def sync(self):
|
||||
self._log("Syncing...", level='info')
|
||||
|
||||
FOR STANDALONE UTILITIES: Use get_logger()
|
||||
-----------------------------------------------------------------
|
||||
from services.logging_utils import get_logger
|
||||
|
||||
logger = get_logger('my_module', context)
|
||||
logger.info("Processing...")
|
||||
|
||||
CONSISTENCY RULES:
|
||||
==================
|
||||
✅ Services: get_service_logger('service_name', ctx)
|
||||
✅ Steps: ctx.logger (direct) or get_step_logger('step_name', ctx)
|
||||
✅ Sync Utils: Inherit from BaseSyncUtils → use self._log() or self.logger
|
||||
✅ Standalone: get_logger('module_name', ctx)
|
||||
|
||||
❌ DO NOT: Use module-level logging.getLogger(__name__)
|
||||
❌ DO NOT: Mix get_logger() and get_service_logger() in same module
|
||||
"""
|
||||
|
||||
import logging
|
||||
|
||||
@@ -14,7 +14,7 @@ import pytz
|
||||
from services.exceptions import RedisConnectionError, LockAcquisitionError
|
||||
from services.redis_client import get_redis_client
|
||||
from services.config import SYNC_CONFIG, get_lock_key
|
||||
from services.logging_utils import get_logger
|
||||
from services.logging_utils import get_service_logger
|
||||
|
||||
import redis
|
||||
|
||||
@@ -31,7 +31,7 @@ class BaseSyncUtils:
|
||||
"""
|
||||
self.espocrm = espocrm_api
|
||||
self.context = context
|
||||
self.logger = get_logger('sync_utils', context)
|
||||
self.logger = get_service_logger('sync_utils', context)
|
||||
|
||||
# Use provided Redis client or get from factory
|
||||
self.redis = redis_client or get_redis_client(strict=False)
|
||||
|
||||
@@ -1,10 +1,8 @@
|
||||
"""xAI Files & Collections Service"""
|
||||
import os
|
||||
import aiohttp
|
||||
import logging
|
||||
from typing import Optional, List
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
from services.logging_utils import get_service_logger
|
||||
|
||||
XAI_FILES_URL = "https://api.x.ai"
|
||||
XAI_MANAGEMENT_URL = "https://management-api.x.ai"
|
||||
@@ -23,6 +21,7 @@ class XAIService:
|
||||
self.api_key = os.getenv('XAI_API_KEY', '')
|
||||
self.management_key = os.getenv('XAI_MANAGEMENT_KEY', '')
|
||||
self.ctx = ctx
|
||||
self.logger = get_service_logger('xai', ctx)
|
||||
self._session: Optional[aiohttp.ClientSession] = None
|
||||
|
||||
if not self.api_key:
|
||||
@@ -31,10 +30,9 @@ class XAIService:
|
||||
raise ValueError("XAI_MANAGEMENT_KEY not configured in environment")
|
||||
|
||||
def _log(self, msg: str, level: str = 'info') -> None:
|
||||
if self.ctx:
|
||||
getattr(self.ctx.logger, level, self.ctx.logger.info)(msg)
|
||||
else:
|
||||
getattr(logger, level, logger.info)(msg)
|
||||
"""Delegate logging to service logger"""
|
||||
log_func = getattr(self.logger, level, self.logger.info)
|
||||
log_func(msg)
|
||||
|
||||
async def _get_session(self) -> aiohttp.ClientSession:
|
||||
if self._session is None or self._session.closed:
|
||||
|
||||
Reference in New Issue
Block a user