refactor(logging): replace console in track-event modules with logger
This commit is contained in:
@@ -6,14 +6,16 @@
|
|||||||
*
|
*
|
||||||
* 注意:此文件不得标记 "use server",因为 trackCoursePlanEvent 是同步函数,
|
* 注意:此文件不得标记 "use server",因为 trackCoursePlanEvent 是同步函数,
|
||||||
* 不涉及服务端操作。Next.js 16 要求 "use server" 文件中所有导出必须是 async 函数。
|
* 不涉及服务端操作。Next.js 16 要求 "use server" 文件中所有导出必须是 async 函数。
|
||||||
|
*
|
||||||
|
* 客户端不能导入服务端 pino logger,因此当前为纯 no-op。
|
||||||
|
* 后续接入客户端监控 SDK(如 PostHog/Amplitude)时替换实现即可。
|
||||||
*/
|
*/
|
||||||
|
|
||||||
export function trackCoursePlanEvent(
|
export function trackCoursePlanEvent(
|
||||||
event: string,
|
event: string,
|
||||||
properties?: Record<string, unknown>,
|
properties?: Record<string, unknown>,
|
||||||
): void {
|
): void {
|
||||||
// 预留:接入监控 SDK 后实现
|
// no-op: 预留接口,接入客户端监控 SDK 后实现
|
||||||
if (process.env.NODE_ENV === "development") {
|
void event
|
||||||
console.debug(`[course-plans] ${event}`, properties)
|
void properties
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,10 @@
|
|||||||
* 无需修改调用方代码。
|
* 无需修改调用方代码。
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import { createModuleLogger } from "@/shared/lib/logger"
|
||||||
|
|
||||||
|
const log = createModuleLogger("question-track")
|
||||||
|
|
||||||
/** 题库操作事件类型 */
|
/** 题库操作事件类型 */
|
||||||
export type QuestionEventType =
|
export type QuestionEventType =
|
||||||
| "question:create"
|
| "question:create"
|
||||||
@@ -45,7 +49,7 @@ export interface QuestionEventPayload {
|
|||||||
export function trackQuestionEvent(payload: QuestionEventPayload): void {
|
export function trackQuestionEvent(payload: QuestionEventPayload): void {
|
||||||
// no-op: 预留接口,接入监控系统时替换实现
|
// no-op: 预留接口,接入监控系统时替换实现
|
||||||
if (process.env.NODE_ENV === "development") {
|
if (process.env.NODE_ENV === "development") {
|
||||||
console.debug("[trackQuestionEvent]", payload)
|
log.debug({ payload }, "question track event")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -6,6 +6,10 @@
|
|||||||
* PostHog, Mixpanel, or an internal event pipeline) when ready.
|
* PostHog, Mixpanel, or an internal event pipeline) when ready.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import { createModuleLogger } from "@/shared/lib/logger"
|
||||||
|
|
||||||
|
const log = createModuleLogger("rbac-track")
|
||||||
|
|
||||||
/** The RBAC action being tracked. */
|
/** The RBAC action being tracked. */
|
||||||
export type TrackPermissionAction =
|
export type TrackPermissionAction =
|
||||||
| "set_role_permissions"
|
| "set_role_permissions"
|
||||||
@@ -28,13 +32,13 @@ export interface TrackPermissionChangeParams {
|
|||||||
/**
|
/**
|
||||||
* Track a permission/role change.
|
* Track a permission/role change.
|
||||||
*
|
*
|
||||||
* Currently a no-op (console.debug only). The interface is stable so call
|
* Currently a no-op (logger.debug only). The interface is stable so call
|
||||||
* sites can be wired up without touching the actions layer again.
|
* sites can be wired up without touching the actions layer again.
|
||||||
*/
|
*/
|
||||||
export function trackPermissionChange(params: TrackPermissionChangeParams): void {
|
export function trackPermissionChange(params: TrackPermissionChangeParams): void {
|
||||||
// Reserved for future analytics implementation.
|
// Reserved for future analytics implementation.
|
||||||
// Intentionally minimal: avoid importing heavy SDKs until needed.
|
// Intentionally minimal: avoid importing heavy SDKs until needed.
|
||||||
if (process.env.NODE_ENV !== "production") {
|
if (process.env.NODE_ENV !== "production") {
|
||||||
console.debug("[rbac:track]", params)
|
log.debug({ params }, "rbac track")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
import "server-only"
|
import "server-only"
|
||||||
|
|
||||||
|
import { createModuleLogger } from "@/shared/lib/logger"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 监控埋点接口(预留)
|
* 监控埋点接口(预留)
|
||||||
*
|
*
|
||||||
@@ -8,11 +10,13 @@ import "server-only"
|
|||||||
* - 通知发送失败告警
|
* - 通知发送失败告警
|
||||||
* - 用户行为漏斗分析
|
* - 用户行为漏斗分析
|
||||||
*
|
*
|
||||||
* 当前实现:输出到 console.info,不阻塞主流程。
|
* 当前实现:输出到 logger.info,不阻塞主流程。
|
||||||
* 后续扩展:可接入外部监控服务(如 Sentry / PostHog / 自建埋点系统),
|
* 后续扩展:可接入外部监控服务(如 Sentry / PostHog / 自建埋点系统),
|
||||||
* 只需在 trackEventToSink 中替换实现即可,调用方无需改动。
|
* 只需在 trackEventToSink 中替换实现即可,调用方无需改动。
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
const log = createModuleLogger("track")
|
||||||
|
|
||||||
/** 事件名称(使用点号分隔的命名空间,如 "announcement.published") */
|
/** 事件名称(使用点号分隔的命名空间,如 "announcement.published") */
|
||||||
export type EventName =
|
export type EventName =
|
||||||
| "announcement.created"
|
| "announcement.created"
|
||||||
@@ -137,12 +141,19 @@ export interface TrackEventPayload {
|
|||||||
/**
|
/**
|
||||||
* 将事件发送到外部监控服务。
|
* 将事件发送到外部监控服务。
|
||||||
*
|
*
|
||||||
* 当前为占位实现:仅输出到 console.info。
|
* 当前为占位实现:仅输出到 logger.info。
|
||||||
* 接入真实服务时替换此函数体即可。
|
* 接入真实服务时替换此函数体即可。
|
||||||
*/
|
*/
|
||||||
function trackEventToSink(payload: TrackEventPayload): void {
|
function trackEventToSink(payload: TrackEventPayload): void {
|
||||||
console.info(
|
log.info(
|
||||||
`[TrackEvent] ${payload.event} userId=${payload.userId ?? "-"} targetId=${payload.targetId ?? "-"}${payload.properties ? ` properties=${JSON.stringify(payload.properties)}` : ""}`
|
{
|
||||||
|
event: payload.event,
|
||||||
|
userId: payload.userId,
|
||||||
|
targetId: payload.targetId,
|
||||||
|
targetType: payload.targetType,
|
||||||
|
properties: payload.properties,
|
||||||
|
},
|
||||||
|
"track event"
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user