Исправлено: - 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)
42 lines
1.2 KiB
Python
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()
|