本文说明后端系统 logger 的配置方式,以及各个配置项在运行时会影响什么行为。Documentation Index
Fetch the complete documentation index at: https://docs.xpertai.cn/llms.txt
Use this file to discover all available pages before exploring further.
概览
当前 logger 基于nestjs-pino 和 pino 实现。
- HTTP 请求日志和 Nest 应用日志会走同一套 logger 管线。
- 日志会同时输出到控制台和轮转文件。
- 非生产环境下,控制台日志会通过
pino-pretty做可读化格式化。 - 生产环境下,控制台会保持结构化 JSON 输出到
stdout。 - 默认日志文件名为
xpert-server.log。
配置项
| 变量 | 默认值 | 说明 |
|---|---|---|
NODE_ENV | development | 控制控制台输出格式。production 时输出 JSON 到 stdout;其他环境使用单行可读格式。 |
LOG_LEVEL | log | 基础日志级别。Nest 风格级别会映射为 pino 级别:verbose -> trace、debug -> debug、log -> info、warn -> warn、error -> error、fatal -> fatal。也可以直接使用 trace、info、fatal、silent 等 pino 级别。 |
LOG_FILE_PATH | 未设置 | 当前日志文件的完整路径。设置后优先级高于 LOG_DIR。 |
LOG_DIR | <process.cwd()>/logs | 在未设置 LOG_FILE_PATH 时使用的日志目录,当前文件名固定为 xpert-server.log。 |
LOG_FILE_MAX_SIZE | 10m | 当前日志文件达到该大小后触发轮转。支持单位:b、k、kb、m、mb、g、gb。 |
LOG_FILE_MAX_FILES | 5 | 保留的日志文件总数,包含当前活跃文件。 |
输出行为
控制台
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