refactor(logging): replace console in track-event modules with logger

This commit is contained in:
SpecialX
2026-07-07 12:14:23 +08:00
parent fefc65702d
commit 0a034945d4
4 changed files with 32 additions and 11 deletions

View File

@@ -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
}
} }

View File

@@ -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")
} }
} }

View File

@@ -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")
} }
} }

View File

@@ -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"
) )
} }