feat(logger): 添加 winston 日志系统

- 新增 src/lib/logger/ 模块
- 支持 dev/prod 环境不同输出格式
- createLogger() 创建带上下文的 logger
- 更新 AGENTS.md 添加日志使用约定
This commit is contained in:
2026-03-08 14:52:24 +08:00
parent d7149366e9
commit 0881846717
6 changed files with 221 additions and 1 deletions

16
src/lib/logger/index.ts Normal file
View File

@@ -0,0 +1,16 @@
import { logger } from "./logger";
export { logger };
export function createLogger(context: string) {
return {
debug: (message: string, meta?: object) =>
logger.debug(`[${context}] ${message}`, meta),
info: (message: string, meta?: object) =>
logger.info(`[${context}] ${message}`, meta),
warn: (message: string, meta?: object) =>
logger.warn(`[${context}] ${message}`, meta),
error: (message: string, meta?: object) =>
logger.error(`[${context}] ${message}`, meta),
};
}

9
src/lib/logger/logger.ts Normal file
View File

@@ -0,0 +1,9 @@
import winston from "winston";
import { devTransport, prodTransport } from "./transports";
const isDev = process.env.NODE_ENV !== "production";
export const logger = winston.createLogger({
level: isDev ? "debug" : "info",
transports: [isDev ? devTransport : prodTransport],
});

View File

@@ -0,0 +1,20 @@
import { transports, format } from "winston";
const { combine, timestamp, printf, colorize, json } = format;
const customFormat = printf(({ level, message, timestamp, ...metadata }) => {
const metaStr = Object.keys(metadata).length ? JSON.stringify(metadata) : "";
return `${timestamp} [${level}]: ${message} ${metaStr}`;
});
export const devTransport = new transports.Console({
format: combine(
colorize(),
timestamp({ format: "YYYY-MM-DD HH:mm:ss" }),
customFormat
),
});
export const prodTransport = new transports.Console({
format: combine(timestamp(), json()),
});