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:
@@ -21,9 +21,12 @@ from pydantic import BaseModel
|
||||
|
||||
from backend.audit import audit_log, can_access_unit
|
||||
from backend.database import get_db
|
||||
from backend.logging_setup import get_logger
|
||||
from backend.models import SearchOperation, User
|
||||
from backend.routers.auth import get_current_user, require_permission
|
||||
|
||||
log = get_logger('contour')
|
||||
|
||||
router = APIRouter(prefix='/api/v1/operations', tags=['operations-contour'])
|
||||
|
||||
def _contour_url() -> str:
|
||||
@@ -147,11 +150,14 @@ def send_to_contour(
|
||||
headers={'Authorization': f'Bearer {_contour_token()}'},
|
||||
timeout=30.0)
|
||||
except httpx.HTTPError as e:
|
||||
log.warning('contour_send_failed op=%s url=%s error=%s', op.id, _contour_url(), e)
|
||||
audit_log(db, current_user, 'contour_send_failed', object_type='operation',
|
||||
object_id=str(op.id), request=request, details={'error': str(e)})
|
||||
raise HTTPException(status_code=502, detail=f'КОНТУР недоступен: {e}') from e
|
||||
|
||||
if resp.status_code >= 400:
|
||||
log.warning('contour_rejected op=%s status=%d body=%s',
|
||||
op.id, resp.status_code, resp.text[:200])
|
||||
audit_log(db, current_user, 'contour_send_failed', object_type='operation',
|
||||
object_id=str(op.id), request=request,
|
||||
details={'status': resp.status_code, 'body': resp.text[:500]})
|
||||
@@ -159,6 +165,8 @@ def send_to_contour(
|
||||
detail=f'КОНТУР отклонил импорт: {resp.status_code} {resp.text[:300]}')
|
||||
|
||||
result = resp.json()
|
||||
log.info('contour_send_ok op=%s зон=%d contour_op=%s',
|
||||
op.id, len(payload['zones']), op.contour_operation_id)
|
||||
audit_log(db, current_user, 'contour_send_ok', object_type='operation',
|
||||
object_id=str(op.id), request=request,
|
||||
details={'zones': result.get('zones_total'), 'status': result.get('status')})
|
||||
|
||||
Reference in New Issue
Block a user