B22: прикладное логирование vector.* + администрирование в доках (по образцу РВС)

- backend/logging_setup.py: setup_logging() (stdout INFO + файл /tmp/vector/vector.log,
  ротация 5×2 МБ, VectorLOGLEVEL/VectorLOGFILE/VectorLOGDIR), get_logger('vector.*')
- события: vector.analyze (матрасчёт с длительностью), vector.auth (login_ok/failed/
  lockout), vector.audit (каждая запись), vector.contour (ok/failed/rejected),
  vector.operations (operation_complete), vector.geocode (успех/timeout/ошибка)
- существующие логгеры переведены в namespace vector.* (geo, geo.osm, rules, water, admin)
- README §13а: таблица наблюдаемых событий + правила (без ПДн/секретов)
- SETUP_GUIDE: §15 RPO/RTO + backup≠restore, §16 grep по vector.*, §17 диагностика
  по цепочкам (БД, 500, fallback-зоны, вход), §17а чек-лист передачи проекта
- DEPLOY.md: вместо устаревшего дубля — ссылка на актуальные доки + шпаргалка стенда
- тесты: 239 passed
This commit is contained in:
2026-09-25 09:38:39 +03:00
parent 1513bad538
commit d5a270f3af
16 changed files with 345 additions and 117 deletions
+6
View File
@@ -13,10 +13,13 @@ from pydantic import BaseModel
from sqlalchemy.orm import Session
from backend.audit import audit_log, visible_unit_ids
from backend.logging_setup import get_logger
from backend.database import get_db
from backend.models import Case, SearchOperation, User
from backend.routers.auth import get_current_user, require_permission
oplog = get_logger('operations')
router = APIRouter(prefix='/api/v1/operations', tags=['operations'])
ALLOWED_TRANSITIONS = {
@@ -203,6 +206,9 @@ def complete_operation(
db.commit()
oplog.info('operation_complete op=%s case=%s исход=%s юзер=%s',
op.id, case.id, 'найден живым' if payload.found_alive else 'найден погибшим',
getattr(current_user, 'username', '—'))
audit_log(db, current_user, 'operation_complete',
object_type='search_operation', object_id=str(op.id),
details={'case_id': str(case.id), 'found_alive': payload.found_alive})