Michael Wang преди 3 години
родител
ревизия
680b9ee905
променени са 3 файла, в които са добавени 47 реда и са изтрити 10 реда
  1. 1 1
      src/features/UserLogin/UserLogin.vue
  2. 1 1
      src/store/store.ts
  3. 45 8
      src/utils/logger.ts

+ 1 - 1
src/features/UserLogin/UserLogin.vue

@@ -2,7 +2,7 @@
 import { loginApi } from "@/api/login";
 import { store } from "@/store/store";
 
-logger({ cnl: ["console"], pgu: "登录页面" });
+logger({ cnl: ["console"], pgn: "登录页面", act: "首次渲染" });
 
 const accountType = $ref("STUDENT_CODE");
 const accountValue = $ref("");

+ 1 - 1
src/store/store.ts

@@ -34,7 +34,7 @@ export const useStore = defineStore("ecs", {
 
 export let store = null as unknown as ReturnType<typeof useStore>;
 
-setTimeout(() => {
+void Promise.resolve(0).then(() => {
   store = useStore();
 
   store.$subscribe((_mutation, state) => {

+ 45 - 8
src/utils/logger.ts

@@ -1,21 +1,58 @@
-// type x =
+import { store } from "@/store/store";
+import moment from "moment";
+import { omit } from "lodash-es";
+
 type LogDetail = {
   level?: "debug" | "log" | "warn" | "error";
   /** channels. 往哪些渠道放日志? */
   cnl?: ("console" | "local" | "server" | "bd")[];
-  /** page url */
-  pgu?: string;
-  /** statck 错误信息的stack,单条信息也放此处 */
+  /** 操作的类型,方便在日志里面查找相同类型的操作 */
+  key?: string;
+  /** page name */
+  pgn?: string;
+  /** page url: AUTO => 自动从location.path获取 */
+  pgu?: "AUTO" | `/${string}`;
+  /** action 引发本次日志的操作 */
+  act?: string;
+  /** statck 错误信息的stack,单条错误信息也放此处 */
   stk?: string;
   /** detail 详细信息 */
   dtl?: string;
-  /** 扩展字段的集合。TODO: 消除这里的any */
+  /** api url  */
+  aul?: string;
+  /** api status  */
+  aus?: string;
+  /** error json */
+  ejn?: string;
+  /** 扩展字段的集合。TODO: 消除这里的any,提示不允许出去前面的字段 */
   ext?: any;
 };
-/** 记录重要日志到多个source */
+/** 记录重要日志到多个source
+ * 示例:
+ * @param detail.key - '本地人脸比对'
+ * @param detail.pgn - '登录页面' | '在线考试列表页面'
+ * @param detail.act - '点击登录按钮'
+ * @param detail.stk - error.stack
+ * @param detail.dtl - '第一次点击登录' | '第二次点击登录' // 方便查询
+ * @param detail.aul - '/api/login'
+ * @param detail.aus - '500'
+ * @param detail.ejn - JSON.stringify({a: 0})
+ * @param detail.ext - {UA: 'chrome 99'}
+ */
 export default function (detail: LogDetail) {
-  const newDetail = Object.assign({ level: "log" }, detail);
-  if (newDetail.cnl?.includes("console")) {
+  const user = store.user;
+  const defaultFileds = {
+    level: "log",
+    uuidForEcs: localStorage.getItem("uuidForEcs"),
+    clientDate: moment().format("YYYY-MM-DD HH:mm:ss.SSS"),
+    ...(user?.id ? { userId: user.id } : {}),
+  };
+  const newDetail = Object.assign(
+    defaultFileds,
+    omit(detail, "ext"),
+    detail.ext
+  );
+  if (detail.cnl?.includes("console")) {
     console.log(newDetail);
   }
 }