Claude Code Claude Opus 4.6 commited on
Commit
b4b8c2c
·
1 Parent(s): 02a1ea1

Claude Code: Add CRITICAL STARTUP ERROR logging and stdout capture

Browse files

- Wrap uvicorn startup with try-except using requested error format
- Add stdout handler to logging config for immediate capture
- Fix uvicorn log_config parameter to use proper defaults

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

Files changed (1) hide show
  1. app.py +11 -8
app.py CHANGED
@@ -24,11 +24,15 @@ def get_app():
24
 
25
  print(">>> CAIN: Creating FastAPI app...", flush=True)
26
 
27
- # Configure stderr logging for real-time debugging (stdout can be buffered)
28
  logging.basicConfig(
29
  level=logging.INFO,
30
  format='%(asctime)s - %(levelname)s - %(message)s',
31
- handlers=[logging.StreamHandler(sys.stderr)]
 
 
 
 
32
  )
33
  logger = logging.getLogger(__name__)
34
  logger.info(">>> CAIN: FastAPI initialization starting")
@@ -97,13 +101,12 @@ if __name__ == "__main__":
97
  try:
98
  port = int(os.environ.get('PORT', 7860))
99
  print(f">>> CAIN: Starting uvicorn on port {port}...", flush=True, file=sys.stderr)
100
- uvicorn.run("app:app", host="0.0.0.0", port=port, log_config="uvicorn.config:LOGGING_CONFIG")
101
  except Exception as e:
102
- # Log full stack trace to stderr before exiting
103
- print(f">>> CAIN: FATAL - Main process crashed!", flush=True, file=sys.stderr)
104
- print(f">>> CAIN: Error: {type(e).__name__}: {e}", flush=True, file=sys.stderr)
105
- print(f">>> CAIN: Full traceback:", flush=True, file=sys.stderr)
106
- traceback.print_exc(file=sys.stderr)
107
  sys.exit(1)
108
  except KeyboardInterrupt:
109
  print("\n>>> CAIN: Interrupted by user", flush=True, file=sys.stderr)
 
24
 
25
  print(">>> CAIN: Creating FastAPI app...", flush=True)
26
 
27
+ # Configure logging to both stdout and stderr for immediate capture
28
  logging.basicConfig(
29
  level=logging.INFO,
30
  format='%(asctime)s - %(levelname)s - %(message)s',
31
+ handlers=[
32
+ logging.StreamHandler(sys.stdout), # Force stdout immediate capture
33
+ logging.StreamHandler(sys.stderr)
34
+ ],
35
+ force=True # Override any existing config
36
  )
37
  logger = logging.getLogger(__name__)
38
  logger.info(">>> CAIN: FastAPI initialization starting")
 
101
  try:
102
  port = int(os.environ.get('PORT', 7860))
103
  print(f">>> CAIN: Starting uvicorn on port {port}...", flush=True, file=sys.stderr)
104
+ uvicorn.run("app:app", host="0.0.0.0", port=port, log_config=None)
105
  except Exception as e:
106
+ # Log full stack trace before exiting - use requested format
107
+ print(f"CRITICAL STARTUP ERROR: {e}", flush=True)
108
+ print(f"CRITICAL STARTUP ERROR: {e}", flush=True, file=sys.stderr)
109
+ traceback.print_exc()
 
110
  sys.exit(1)
111
  except KeyboardInterrupt:
112
  print("\n>>> CAIN: Interrupted by user", flush=True, file=sys.stderr)