Spaces:
Running
Running
fix: filter /health hits from uvicorn access log
Browse filesCustom HealthEndpointFilter drops /health from uvicorn.access handler.
Nginx proxy-passes health probes to backend, causing log spam every 30s.
Filter reads ASGI scope.path so it catches it before message formatting.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
start.sh
CHANGED
|
@@ -376,11 +376,26 @@ nginx -t 2>/dev/null && nginx || {
|
|
| 376 |
exit 1
|
| 377 |
}
|
| 378 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 379 |
# ββ Logging config: silence per-request noise ββββββββββββββββββββ
|
| 380 |
cat > /tmp/logging-config.json << 'LOGEOF'
|
| 381 |
{
|
| 382 |
"version": 1,
|
| 383 |
"disable_existing_loggers": false,
|
|
|
|
|
|
|
|
|
|
| 384 |
"formatters": {
|
| 385 |
"default": {
|
| 386 |
"()": "uvicorn.logging.DefaultFormatter",
|
|
@@ -394,14 +409,14 @@ cat > /tmp/logging-config.json << 'LOGEOF'
|
|
| 394 |
},
|
| 395 |
"handlers": {
|
| 396 |
"default": {"formatter": "default", "class": "logging.StreamHandler", "stream": "ext://sys.stdout"},
|
| 397 |
-
"access": {"formatter": "access", "class": "logging.StreamHandler", "stream": "ext://sys.stdout"}
|
| 398 |
},
|
| 399 |
"loggers": {
|
| 400 |
"uvicorn": {"handlers": ["default"], "level": "INFO", "propagate": false},
|
| 401 |
"uvicorn.error": {"level": "INFO"},
|
| 402 |
"uvicorn.access": {"handlers": ["access"], "level": "INFO", "propagate": false},
|
| 403 |
-
"google_genai":
|
| 404 |
-
"google_genai.models":
|
| 405 |
"google_genai._api_client": {"level": "WARNING"},
|
| 406 |
"httpx": {"level": "WARNING"},
|
| 407 |
"primp": {"level": "WARNING"},
|
|
@@ -415,7 +430,7 @@ LOGEOF
|
|
| 415 |
echo "Starting DeerFlow backend on port $BACKEND_PORT..."
|
| 416 |
(
|
| 417 |
cd "$APP_DIR/backend" && \
|
| 418 |
-
PYTHONPATH=. \
|
| 419 |
PYTHONWARNINGS="ignore::UserWarning:pydantic" \
|
| 420 |
uv run --no-sync \
|
| 421 |
uvicorn app.gateway.app:app \
|
|
|
|
| 376 |
exit 1
|
| 377 |
}
|
| 378 |
|
| 379 |
+
# ββ Custom log filter: drop /health from uvicorn access log βββββββ
|
| 380 |
+
cat > /tmp/hf_log_filter.py << 'EOF'
|
| 381 |
+
import logging
|
| 382 |
+
|
| 383 |
+
class HealthEndpointFilter(logging.Filter):
|
| 384 |
+
def filter(self, record):
|
| 385 |
+
try:
|
| 386 |
+
return record.scope.get("path", "") != "/health"
|
| 387 |
+
except AttributeError:
|
| 388 |
+
return "/health" not in record.getMessage()
|
| 389 |
+
EOF
|
| 390 |
+
|
| 391 |
# ββ Logging config: silence per-request noise ββββββββββββββββββββ
|
| 392 |
cat > /tmp/logging-config.json << 'LOGEOF'
|
| 393 |
{
|
| 394 |
"version": 1,
|
| 395 |
"disable_existing_loggers": false,
|
| 396 |
+
"filters": {
|
| 397 |
+
"no_health": {"()": "hf_log_filter.HealthEndpointFilter"}
|
| 398 |
+
},
|
| 399 |
"formatters": {
|
| 400 |
"default": {
|
| 401 |
"()": "uvicorn.logging.DefaultFormatter",
|
|
|
|
| 409 |
},
|
| 410 |
"handlers": {
|
| 411 |
"default": {"formatter": "default", "class": "logging.StreamHandler", "stream": "ext://sys.stdout"},
|
| 412 |
+
"access": {"formatter": "access", "class": "logging.StreamHandler", "stream": "ext://sys.stdout", "filters": ["no_health"]}
|
| 413 |
},
|
| 414 |
"loggers": {
|
| 415 |
"uvicorn": {"handlers": ["default"], "level": "INFO", "propagate": false},
|
| 416 |
"uvicorn.error": {"level": "INFO"},
|
| 417 |
"uvicorn.access": {"handlers": ["access"], "level": "INFO", "propagate": false},
|
| 418 |
+
"google_genai": {"level": "WARNING"},
|
| 419 |
+
"google_genai.models": {"level": "WARNING"},
|
| 420 |
"google_genai._api_client": {"level": "WARNING"},
|
| 421 |
"httpx": {"level": "WARNING"},
|
| 422 |
"primp": {"level": "WARNING"},
|
|
|
|
| 430 |
echo "Starting DeerFlow backend on port $BACKEND_PORT..."
|
| 431 |
(
|
| 432 |
cd "$APP_DIR/backend" && \
|
| 433 |
+
PYTHONPATH=".:/tmp" \
|
| 434 |
PYTHONWARNINGS="ignore::UserWarning:pydantic" \
|
| 435 |
uv run --no-sync \
|
| 436 |
uvicorn app.gateway.app:app \
|