Node.js 把日志存在哪里?
Node.js 本身不写日志文件,console.log 输出到 stdout、错误到 stderr;可用 shell 重定向落盘,或用 Winston/Pino 等日志库管理,生产建议输出到 stdout 由采集器接管。
直接答案:Node.js 自己不在任何文件里存日志**——console.log 打印到标准输出(stdout),console.error 打印到标准错误(stderr),进程一关就没了。想落盘,要么用 shell 重定向,要么在代码里接入日志库,要么交给进程管理器。**
方式一:启动时重定向(最简)
node my_app.js > my_app_log.log 2> my_app_err.log
stdout 进 my_app_log.log,stderr 进 my_app_err.log。缺点:没有轮转、没有时间格式控制,只适合临时用。
方式二:进程管理器(中小规模推荐)
用 PM2 托管进程,日志自动落盘并支持轮转:
pm2 start my_app.js
pm2 logs # 实时查看
ls ~/.pm2/logs/ # 日志文件位置
systemd 托管的话,输出默认进 journal:journalctl -u my-node-app -f。
方式三:日志库(生产推荐)
Winston、Pino、Log4js 等库支持分级、JSON 结构化、多输出目标:
const pino = require('pino');
const logger = pino(); // 默认 JSON 输出到 stdout
logger.info({ userId: 42 }, 'user login');
logger.error({ err }, 'request failed');
容器环境的最佳实践是输出 JSON 到 stdout,不写文件——由容器运行时和采集器接管,应用保持无状态。
观测云对照
Node.js 日志接入观测云。 容器部署时 DataKit 按容器采集 stdout 日志,JSON 结构自动解析成字段;配合 APM 探针还能把日志与 Trace 关联,从一条报错日志直接跳到完整调用链。
常见问题(FAQ)
Q:console.log 对性能有影响吗?
A:有。同步写 stdout 在高并发下是瓶颈,生产环境用 Pino 这类异步高性能日志库。
Q:线上排查想临时看日志怎么办?
A:PM2 用 pm2 logs;systemd 用 journalctl -u 服务名 -f;容器用 docker logs -f 或 kubectl logs -f。
Q:需要按天分文件怎么办?
A:PM2 装 pm2-logrotate 模块;日志库方案用 pino-roll 或 Winston 的 daily-rotate-file transport。