systemLogApi.ts 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. import { apiUrl, getAgentHeaders } from "@/lib/config";
  2. export interface SystemLogItem {
  3. id: number;
  4. timestamp: string;
  5. level: string;
  6. category: string;
  7. event: string;
  8. source: string;
  9. trace_id?: string;
  10. conversation_id?: number;
  11. user_id?: number;
  12. visitor_id?: number;
  13. message: string;
  14. meta_json?: string;
  15. created_at: string;
  16. }
  17. export interface QuerySystemLogsResult {
  18. items: SystemLogItem[];
  19. total: number;
  20. page: number;
  21. page_size: number;
  22. }
  23. export interface QuerySystemLogsParams {
  24. from?: string;
  25. to?: string;
  26. level?: string;
  27. category?: string;
  28. event?: string;
  29. source?: string;
  30. conversationId?: number;
  31. keyword?: string;
  32. page?: number;
  33. pageSize?: number;
  34. }
  35. export async function fetchSystemLogs(params: QuerySystemLogsParams): Promise<QuerySystemLogsResult> {
  36. const q = new URLSearchParams();
  37. if (params.from) q.set("from", params.from);
  38. if (params.to) q.set("to", params.to);
  39. if (params.level) q.set("level", params.level);
  40. if (params.category) q.set("category", params.category);
  41. if (params.event) q.set("event", params.event);
  42. if (params.source) q.set("source", params.source);
  43. if (params.conversationId != null) q.set("conversation_id", String(params.conversationId));
  44. if (params.keyword) q.set("keyword", params.keyword);
  45. q.set("page", String(params.page ?? 1));
  46. q.set("page_size", String(params.pageSize ?? 50));
  47. const res = await fetch(`${apiUrl("/agent/logs/api")}?${q.toString()}`, {
  48. headers: getAgentHeaders(),
  49. });
  50. if (!res.ok) {
  51. const j = await res.json().catch(() => ({}));
  52. throw new Error((j as { error?: string }).error || `加载日志失败(${res.status})`);
  53. }
  54. return res.json();
  55. }
  56. export async function reportFrontendLog(input: {
  57. level: "info" | "warn" | "error";
  58. category: string;
  59. event: string;
  60. message: string;
  61. traceId?: string;
  62. conversationId?: number;
  63. visitorId?: number;
  64. meta?: Record<string, unknown>;
  65. }): Promise<void> {
  66. const payload: Record<string, unknown> = {
  67. level: input.level,
  68. category: input.category,
  69. event: input.event,
  70. message: input.message,
  71. trace_id: input.traceId,
  72. conversation_id: input.conversationId,
  73. visitor_id: input.visitorId,
  74. meta: input.meta ?? {},
  75. };
  76. const res = await fetch(apiUrl("/agent/logs/frontend"), {
  77. method: "POST",
  78. headers: {
  79. "Content-Type": "application/json",
  80. ...getAgentHeaders(),
  81. },
  82. body: JSON.stringify(payload),
  83. });
  84. if (!res.ok) {
  85. // 日志上报失败不阻断业务
  86. console.warn("frontend log report failed", res.status);
  87. }
  88. }