|
27 | 27 |
|
28 | 28 | # Default configuration |
29 | 29 | DEFAULT_LOG_LEVEL = logging.INFO |
30 | | -DEFAULT_DB_PATH = 'logs/dialogchain.db' |
31 | | -DEFAULT_LOG_FILE = 'logs/dialogchain.log' |
| 30 | +DEFAULT_LOG_DIR = 'logs' |
| 31 | +DEFAULT_DB_PATH = f'{DEFAULT_LOG_DIR}/dialogchain.db' |
| 32 | +DEFAULT_LOG_FILE = f'{DEFAULT_LOG_DIR}/dialogchain.log' |
32 | 33 | MAX_LOG_SIZE = 10 * 1024 * 1024 # 10MB |
33 | 34 | BACKUP_COUNT = 5 |
34 | 35 |
|
35 | 36 | # Thread lock for SQLite operations |
36 | 37 | db_lock = threading.Lock() |
37 | 38 |
|
| 39 | +def _ensure_log_dir(): |
| 40 | + """Ensure log directory exists.""" |
| 41 | + try: |
| 42 | + # Skip if already exists |
| 43 | + if os.path.exists(DEFAULT_LOG_DIR): |
| 44 | + # If it's a file, remove it |
| 45 | + if not os.path.isdir(DEFAULT_LOG_DIR): |
| 46 | + os.remove(DEFAULT_LOG_DIR) |
| 47 | + os.makedirs(DEFAULT_LOG_DIR, exist_ok=True) |
| 48 | + return True |
| 49 | + |
| 50 | + # Create directory if it doesn't exist |
| 51 | + os.makedirs(DEFAULT_LOG_DIR, exist_ok=True) |
| 52 | + return True |
| 53 | + except Exception as e: |
| 54 | + print(f"Warning: Could not create log directory: {e}", file=sys.stderr) |
| 55 | + return False |
| 56 | + |
38 | 57 | # Create a module-level logger that doesn't trigger setup |
39 | 58 | _logger = logging.getLogger(__name__) |
40 | 59 | _logger.setLevel(DEFAULT_LOG_LEVEL) |
41 | 60 |
|
42 | | -# Prevent duplicate handlers |
| 61 | +# Ensure log directory exists |
| 62 | +_log_dir_ready = _ensure_log_dir() |
| 63 | + |
| 64 | +# Add console handler by default |
43 | 65 | if not _logger.handlers: |
44 | | - # Create logs directory if it doesn't exist |
45 | | - os.makedirs(os.path.dirname(DEFAULT_DB_PATH) or '.', exist_ok=True) |
46 | | - os.makedirs(os.path.dirname(DEFAULT_LOG_FILE) or '.', exist_ok=True) |
47 | | - |
48 | | - # Console handler |
49 | | - console_handler = logging.StreamHandler(sys.stdout) |
| 66 | + console_handler = logging.StreamHandler(sys.stderr) |
50 | 67 | console_formatter = logging.Formatter( |
51 | 68 | '%(asctime)s - %(name)s - %(levelname)s - %(message)s', |
52 | 69 | datefmt='%Y-%m-%d %H:%M:%S' |
53 | 70 | ) |
54 | 71 | console_handler.setFormatter(console_formatter) |
55 | 72 | _logger.addHandler(console_handler) |
56 | | - |
57 | | - # File handler with rotation |
| 73 | + |
| 74 | +# Add file handler if directory is ready |
| 75 | +if _log_dir_ready and not any(isinstance(h, logging.FileHandler) for h in _logger.handlers): |
58 | 76 | try: |
59 | 77 | file_handler = RotatingFileHandler( |
60 | 78 | DEFAULT_LOG_FILE, |
|
64 | 82 | ) |
65 | 83 | file_formatter = logging.Formatter( |
66 | 84 | '{"timestamp": "%(asctime)s", "level": "%(levelname)s", ' |
67 | | - '"module": "%(name)s", "message": "%(message)s", "data": %(extra)s}', |
68 | | - datefmt='%Y-%m-%dT%H:%M:%S%z' |
| 85 | + '"module": "%(name)s", "message": "%(message)s"}' |
69 | 86 | ) |
70 | 87 | file_handler.setFormatter(file_formatter) |
71 | 88 | _logger.addHandler(file_handler) |
| 89 | + _logger.info(f"File logging initialized at: {os.path.abspath(DEFAULT_LOG_FILE)}") |
72 | 90 | except Exception as e: |
73 | 91 | _logger.error(f"Failed to initialize file handler: {e}", exc_info=True) |
74 | 92 |
|
|
0 commit comments