demo_debug_log.py 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. """Demo: how to use DebugLogger in real scripts.
  2. Run this from the cq2_sdk directory:
  3. uv run python scripts/demo_debug_log.py
  4. It exercises 4 patterns:
  5. 1. basic context-manager + step()
  6. 2. HTTP request/response correlation
  7. 3. error event from a caught exception
  8. 4. auto-error on context-manager exit when an exception escapes
  9. Output: a new .jsonl file in D:\\传奇\\debug_logs\\.
  10. After running, try:
  11. cat "D:/传奇/debug_logs/session_*.jsonl" | head
  12. # or in OpenCode: ask it to read the newest session_*.jsonl
  13. """
  14. from __future__ import annotations
  15. import sys
  16. from pathlib import Path
  17. # allow running this script from anywhere
  18. sys.path.insert(0, str(Path(__file__).resolve().parent.parent / "src"))
  19. from cq2_sdk.debug_log import DebugLogger # noqa: E402
  20. def main() -> int:
  21. print("=== Demo 1: basic step logging ===")
  22. with DebugLogger(extra={"demo": "v1", "purpose": "pattern_showcase"}) as log:
  23. log.step("login_attempt", account="longwu988", server="玖扬复古176")
  24. log.info("entered login flow")
  25. print("=== Demo 2: HTTP correlation ===")
  26. req_id = log.http_request(
  27. "POST",
  28. "https://api.jiyuhz.cn/auth/v3/login/safe/byPwd",
  29. headers={"X-Box-Auth": "<hmac>", "User-Agent": "996Box/5.1.1"},
  30. body='{"loginInfo":"<rsa>","channel_id":"abc"}',
  31. step="login_attempt",
  32. )
  33. # pretend we got a response
  34. log.http_response(
  35. req_id,
  36. status=200,
  37. body='{"code":101000,"msg":"需要进行行为校验"}',
  38. duration_ms=769.4,
  39. step="login_attempt",
  40. )
  41. log.info("server demanded geetest, switching solver", req_id=req_id)
  42. print("=== Demo 3: caught error ===")
  43. try:
  44. do_failing_thing()
  45. except ValueError as e:
  46. log.error(e, step="geetest_solve", reason="bad_validate")
  47. print(f"\nlog written to: {log.path}")
  48. print("last 5 lines:")
  49. lines = log.path.read_text(encoding="utf-8").splitlines()
  50. for ln in lines[-5:]:
  51. print(f" {ln}")
  52. return 0
  53. def do_failing_thing() -> None:
  54. raise ValueError("geetest validate token expired")
  55. if __name__ == "__main__":
  56. sys.exit(main())