Linux系统Node.js如何进行日志管理
小樊
45
2025-12-10 12:21:54
Linux 下 Node.js 日志管理实践
一 日志库选择与基础配置
- 常用日志库
- Winston:生态成熟、传输多、易扩展,适合大多数场景。
- Pino:性能高、结构化输出,适合高并发与云原生环境。
- Bunyan:结构化 JSON、便于检索与分析。
- Log4js:功能丰富、支持多输出与轮转。
- 基础配置要点
- 使用结构化日志(如 JSON),便于后续检索与聚合。
- 合理设置日志级别:生产环境常用 error/warn,按需开启 info/debug。
- 区分错误日志与业务/访问日志,便于排障与审计。
- 通过环境变量控制日志级别,避免频繁改代码:例如
process.env.LOG_LEVEL || 'info'。
- 示例(Winston):按级别拆分输出到不同文件,生产写文件、开发打印到控制台。
- 示例(Pino):开发环境用 pino-pretty 美化输出,生产直接写 JSON 到文件或标准输出。
二 日志轮转与清理策略
- 应用内轮转
- Winston:使用 winston-daily-rotate-file,可按天或按大小切分,支持压缩与保留天数。
- Pino:使用 pino-rotate 等插件,按周期切分并控制保留数量与压缩。
- 系统级轮转
- logrotate:Linux 自带,适合容器外或无侵入场景。
- 典型配置:每天轮转、保留 7 天、压缩、空文件不轮转、自动创建新文件并设置权限。
- 放置路径:/etc/logrotate.d/nodejs-app,对目标日志文件生效。
- 兜底清理
- 若无 logrotate,可用 cron 定期清理旧日志(如删除 7 天前文件)。
三 运行与集中式管理
- 进程管理
- 使用 PM2 运行 Node.js:内置日志聚合、日志轮转、实时 tail 等,便于多实例统一查看与运维。
- 系统日志
- 将 Node.js 输出接入 journald/syslog(如通过 systemd 服务或 rsyslog),统一到系统日志链路,便于集中采集与审计。
- 集中式日志平台
- 小规模可用 ELK Stack(Elasticsearch/Logstash/Kibana) 或 Graylog 做检索与可视化。
- 云原生与成本敏感场景可用 Grafana Loki 搭配 Promtail 收集与查询。
四 日常运维与性能优化
- 常用命令
- 实时查看:
tail -f app.log
- 关键字检索:
cat app.log | grep "error"
- 多文件检索:
grep -R "timeout" /var/log/nodejs/
- 性能与可靠性
- 优先异步写入,避免阻塞事件循环。
- 控制日志级别与采样,减少不必要的日志量。
- 规范日志字段(如 timestamp、level、service、trace_id),便于链路追踪与聚合。
- 容器化场景建议将日志写到标准输出/标准错误,由容器运行时收集,避免容器内落盘与权限问题。
五 快速落地示例
- 方案 A(应用内轮转 + PM2)
- 安装依赖:
npm i winston winston-daily-rotate-file
- 配置 logger(按天轮转、保留 14 天、压缩):
- 代码示例:
- const winston = require(‘winston’);
- const { DailyRotateFile } = require(‘winston-daily-rotate-file’);
- const transport = new DailyRotateFile({
filename: ‘/var/log/myapp/application-%DATE%.log’,
datePattern: ‘YYYY-MM-DD’,
zippedArchive: true,
maxSize: ‘20m’,
maxFiles: ‘14d’
});
- const logger = winston.createLogger({
level: process.env.LOG_LEVEL || ‘info’,
format: winston.format.json(),
transports: [transport, new winston.transports.Console()]
});
- 用 PM2 启动:
pm2 start app.js -n myapp,查看日志:pm2 logs myapp。
- 方案 B(系统级 logrotate + 简单输出)
- 应用将日志写到:/var/log/myapp/app.log
- 创建 /etc/logrotate.d/nodejs-app:
- /var/log/myapp/*.log {
daily
missingok
rotate 7
compress
notifempty
create 0640 node node
}
- 手动测试:
logrotate -d /etc/logrotate.d/nodejs-app(干跑),logrotate -f /etc/logrotate.d/nodejs-app(强制执行)。