概览
当前 logger 基于nestjs-pino 和 pino 实现。
- HTTP 请求日志和 Nest 应用日志会走同一套 logger 管线。
- 日志会同时输出到控制台和轮转文件。
- 非生产环境下,控制台日志会通过
pino-pretty做可读化格式化。 - 生产环境下,控制台会保持结构化 JSON 输出到
stdout。 - 默认日志文件名为
xpert-server.log。
配置项
输出行为
控制台
NODE_ENV=production:原样输出 JSON 日志到stdout。- 其他环境:日志会带颜色、压成单行,并附带可读时间格式。
文件
- 文件日志始终是结构化 JSON。
- 如果目标目录不存在,logger 会自动创建目录。
- 日志文件以追加模式打开,服务重启后会继续写入当前活跃文件。
- 路径解析优先级为:
LOG_FILE_PATH->LOG_DIR/xpert-server.log-><process.cwd()>/logs/xpert-server.log。
轮转规则
- 当下一次写入会让当前文件超过
LOG_FILE_MAX_SIZE时,先轮转再写入。 - 轮转后的文件命名为
xpert-server.log.1、xpert-server.log.2等。 LOG_FILE_MAX_FILES=5表示保留 1 个当前文件和 4 个历史备份。LOG_FILE_MAX_FILES=1表示不保留备份,每次轮转都会直接替换当前文件。
请求元数据与安全处理
每条请求日志会附加以下字段:service: xpert-serverenvtraceparenttracestate
- 仅当请求头中的
x-request-id是合法 UUID 时才复用。 - 如果请求没有提供合法 request id,会自动生成新的 UUID。
- 最终 request id 会回写到响应头
x-request-id。 /health和/api/health的自动访问日志会被忽略。- 敏感字段会被替换为
[Redacted]。
req.headers.authorizationreq.headers.cookiereq.headers["x-api-key"]req.body.passwordreq.body.tokenreq.body.accessTokenreq.body.refreshToken
启动集成方式
logger 在 Nest 启动阶段接入:providePinoLoggerModule()注册 pino HTTP logger。app.useLogger(app.get(Logger))让 Nest 使用基于 pino 的 logger。NestLogger.overrideLogger(resolveNestLogLevels())让 Nest 内部日志级别与LOG_LEVEL保持一致。
推荐配置示例
按目录配置日志输出:LOG_FILE_PATH 之后,LOG_DIR 会被忽略。
相关源码
xpert/packages/server/src/logger/pino-logger.tsxpert/packages/server/src/logger/pino-rotating-file.stream.tsxpert/packages/config/src/environments/ienvironment.tsxpert/packages/server/src/bootstrap/index.ts