Files
neo b9db935389 v2.0: исправлены критические баги, добавлены 4 новые проверки, 4-фазный cookie-аудит, retry-логика, YAML-словари, LLM-анализ, тесты
Исправлено:
- engine: _calculate_score() при ошибке загрузки (score не 100 для мёртвых сайтов)
- privacy_link: замена page.goto() на aiohttp (гонка данных)
- form_checkbox: 3-уровневый поиск label + dark-pattern detection
- server_location: синхронный urllib → aiohttp
- api/server: перепутанные request/response модели в batch
- main.py: csv --checks флаг
- engine: фазовая модель (cookie_audit отдельно, остальные параллельно)
- engine: retry-логика (3 попытки, exponential backoff)
- PDF: emoji заменены на текст (WeasyPrint)

Добавлено:
- consent_doc: проверка отдельного согласия на обработку ПД
- operator_info: проверка ИНН/ОГРН/DPO (читает главную + политику)
- cookie_audit: 4-фазный аудит (load→detect→reject→compare)
- llm_policy: опциональный LLM-анализ 16 разделов (--deep)
- external_scripts: YAML-словари trackers.yaml (critical/warning/russian)
- logging (output.py), .gitignore, pyproject.toml
- smoke-тесты (16/16)
2026-06-10 00:49:07 +05:00

42 lines
1.2 KiB
Python

"""Логирование для 152-ФЗ Scanner.
Заменяет print() на структурированный вывод с уровнями и файлом."""
import logging
import sys
from pathlib import Path
from datetime import datetime
LOG_DIR = Path(__file__).parent / "logs"
LOG_DIR.mkdir(exist_ok=True)
def setup_logger(name: str = "scanner", level: int = logging.INFO) -> logging.Logger:
"""Настроить логгер с выводом в консоль + файл."""
logger = logging.getLogger(name)
logger.setLevel(level)
if logger.handlers:
return logger
# Формат: время [уровень] сообщение
fmt = logging.Formatter(
"%(asctime)s [%(levelname)s] %(message)s",
datefmt="%H:%M:%S",
)
# Консоль
console = logging.StreamHandler(sys.stdout)
console.setFormatter(fmt)
logger.addHandler(console)
# Файл
today = datetime.now().strftime("%Y%m%d")
file_handler = logging.FileHandler(LOG_DIR / f"app_{today}.log", encoding="utf-8")
file_handler.setFormatter(fmt)
logger.addHandler(file_handler)
return logger
# Глобальный экземпляр
log = setup_logger()