diff --git a/core/logger.py b/core/logger.py index dfe8d06..784bfa0 100644 --- a/core/logger.py +++ b/core/logger.py @@ -1,6 +1,7 @@ # dnsrecon/core/logger.py import logging +import threading from datetime import datetime from typing import Dict, Any, Optional, List from dataclasses import dataclass, asdict @@ -49,6 +50,7 @@ class ForensicLogger: session_id: Unique identifier for this reconnaissance session """ self.session_id = session_id or self._generate_session_id() + #self.lock = threading.Lock() # Initialize audit trail storage self.api_requests: List[APIRequest] = [] @@ -77,27 +79,7 @@ class ForensicLogger: console_handler = logging.StreamHandler() console_handler.setFormatter(formatter) self.logger.addHandler(console_handler) - - def __getstate__(self): - state = self.__dict__.copy() - # Exclude the unpickleable 'logger' attribute - if 'logger' in state: - del state['logger'] - return state - - def __setstate__(self, state): - self.__dict__.update(state) - # Re-initialize the 'logger' attribute - self.logger = logging.getLogger(f'dnsrecon.{self.session_id}') - self.logger.setLevel(logging.INFO) - formatter = logging.Formatter( - '%(asctime)s - %(name)s - %(levelname)s - %(message)s' - ) - if not self.logger.handlers: - console_handler = logging.StreamHandler() - console_handler.setFormatter(formatter) - self.logger.addHandler(console_handler) - + def _generate_session_id(self) -> str: """Generate unique session identifier.""" return f"dnsrecon_{datetime.now(timezone.utc).strftime('%Y%m%d_%H%M%S')}" @@ -254,4 +236,26 @@ class ForensicLogger: start_time = datetime.fromisoformat(self.session_metadata['start_time']) duration = (end_time - start_time).total_seconds() / 60 - return round(duration, 2) \ No newline at end of file + return round(duration, 2) + + +# Global logger instance for the current session +_current_logger: Optional[ForensicLogger] = None +_logger_lock = threading.Lock() + + +def get_forensic_logger() -> ForensicLogger: + """Get or create the current forensic logger instance.""" + global _current_logger + with _logger_lock: + if _current_logger is None: + _current_logger = ForensicLogger() + return _current_logger + + +def new_session() -> ForensicLogger: + """Start a new forensic logging session.""" + global _current_logger + with _logger_lock: + _current_logger = ForensicLogger() + return _current_logger \ No newline at end of file diff --git a/core/scanner.py b/core/scanner.py index 7f69fdd..0a54d22 100644 --- a/core/scanner.py +++ b/core/scanner.py @@ -8,7 +8,7 @@ from collections import defaultdict from datetime import datetime, timezone from core.graph_manager import GraphManager, NodeType, RelationshipType -from core.logger import ForensicLogger +from core.logger import get_forensic_logger, new_session from utils.helpers import _is_valid_ip, _is_valid_domain from providers.crtsh_provider import CrtShProvider from providers.dns_provider import DNSProvider @@ -73,7 +73,7 @@ class Scanner: # Initialize logger print("Initializing forensic logger...") - self.logger = ForensicLogger() + self.logger = get_forensic_logger() print("Scanner initialization complete") @@ -82,23 +82,6 @@ class Scanner: traceback.print_exc() raise - def __getstate__(self): - state = self.__dict__.copy() - # Exclude unpickleable attributes - for attr in ['stop_event', 'scan_thread', 'executor', 'logger', 'providers']: - if attr in state: - del state[attr] - return state - - def __setstate__(self, state): - self.__dict__.update(state) - # Re-initialize unpickleable attributes - self.stop_event = threading.Event() - self.scan_thread = None - self.executor = None - self.logger = ForensicLogger() - self._initialize_providers() - def _initialize_providers(self) -> None: """Initialize all available providers based on session configuration.""" self.providers = [] @@ -176,7 +159,7 @@ class Scanner: # Start new forensic session print(f"Starting new forensic session for scanner {id(self)}...") - self.logger = ForensicLogger() + self.logger = new_session() # Start scan in separate thread print(f"Starting scan thread for scanner {id(self)}...")