Debian 上配置 Node.js 日志的实用技巧
一 基础选型与结构化输出
- 优先选择成熟的日志库:Winston、Pino、Bunyan、log4js,支持多目标输出(控制台、文件、HTTP)、灵活的日志级别与格式。生产环境建议统一使用结构化日志(JSON),便于检索与分析。
- 区分环境输出:开发环境输出到控制台便于调试,生产环境写入文件并接入集中式系统。
- 合理使用日志级别:如 debug/info/warn/error/fatal,生产默认 info 或 warn,错误单独落盘。
- 示例(Winston,结构化 + 多目标):
- 安装:
npm i winston
- 配置:
- const winston = require(‘winston’);
const logger = winston.createLogger({
level: process.env.LOG_LEVEL || ‘info’,
format: winston.format.combine(
winston.format.timestamp({ format: ‘YYYY-MM-DD HH:mm:ss’ }),
winston.format.json()
),
transports: [
new winston.transports.File({ filename: ‘logs/error.log’, level: ‘error’ }),
new winston.transports.File({ filename: ‘logs/combined.log’ })
]
});
if (process.env.NODE_ENV !== ‘production’) {
logger.add(new winston.transports.Console({ format: winston.format.simple() }));
}
module.exports = logger;
以上做法覆盖库选择、级别控制、结构化与多输出等关键点,适合在 Debian 上作为通用起点。
二 日志轮转与保留策略
- 应用内轮转(推荐组合:Winston + winston-daily-rotate-file):按日期/大小切分,自动压缩与保留天数,对性能影响小、配置集中。
- 安装:
npm i winston-daily-rotate-file
- 示例:
- const DailyRotateFile = require(‘winston-daily-rotate-file’);
const transport = new DailyRotateFile({
filename: ‘logs/application-%DATE%.log’,
datePattern: ‘YYYY-MM-DD’,
zippedArchive: true,
maxSize: ‘20m’,
maxFiles: ‘14d’
});
- 系统级轮转(logrotate):与进程解耦,稳定可靠,适合任何部署方式。
- 创建配置:
/etc/logrotate.d/myapp
- /var/www/myapp/logs/*.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
create 0640 www-data www-data
postrotate
# 如用 PM2:pm2 reload logs
# 如自行管理:kill -USR1 <node_pid> 或应用支持 reopen
endscript
}
- 测试与强制执行:
logrotate -d /etc/logrotate.d/myapp(干跑),logrotate -f /etc/logrotate.d/myapp(强制执行)。
- 若使用 PM2,可直接用插件 pm2-logrotate:
pm2 install pm2-logrotate,常用设置如 compress: true、rotateInterval: '0 0 * * *'(每日)、max_days: 7。
- 选择建议:单应用或容器化倾向应用内轮转;多服务/物理机倾向logrotate;已用 PM2 则优先其插件。
三 输出目标与集中化
- 多目标输出:同时写入错误日志与合并日志,错误单独落盘便于告警与追踪。
- 与 Web 框架集成:Express 使用 morgan 记录 HTTP 请求日志,与业务日志分离,便于分析接口质量与性能。
- 集中式日志:将日志发送到 ELK Stack(Elasticsearch, Logstash, Kibana) 或 Graylog,结合 Grafana/Kibana 做可视化与仪表盘;必要时接入告警。
- 系统日志通道:可将关键事件写入 syslog(通过 rsyslog),统一到系统日志体系,便于合规与审计。
- 小表:常见输出路径与用途
- 控制台:开发调试
- 文件(error.log):仅错误
- 文件(combined.log):全量业务
- 远程(ELK/Graylog):检索、可视化、告警
- syslog:系统级统一日志
以上做法覆盖多目标输出、HTTP 访问日志分离与集中化管理,适合在 Debian 上构建可观测性基础。
四 性能与安全最佳实践
- 异步与非阻塞:使用日志库的异步写入能力,避免 I/O 阻塞主线程;高并发场景优先异步传输与批量写入。
- 异常与未捕获事件:务必监听 uncaughtException、unhandledRejection,在退出前记录关键上下文并安全退出,防止日志丢失。
- 内存与资源:长期运行关注内存占用与日志缓冲;避免拼接超长字符串与无意义对象序列化。
- 权限最小化:日志目录与文件权限遵循最小权限原则,如
create 0640 <appuser> <group>,防止敏感信息泄露。
- 环境变量治理:用 LOG_LEVEL、LOG_DIR 等环境变量控制日志行为,便于不同环境快速切换。
- 监控与告警:结合 Prometheus/Grafana 对错误率、延迟、磁盘使用等建立阈值告警,缩短 MTTR。
这些实践有助于在不牺牲性能的前提下提升可靠性与可维护性。
五 systemd 与 PM2 的日志集成
- 使用 systemd 管理服务时,将 stdout/stderr 交给 journald,通过
journalctl -u <service> 查看与检索;如需落盘,可在服务中写入文件并由 logrotate 管理。
- 使用 PM2 时,内置
pm2 logs 聚合应用日志;可配置 error_file/out_file 分离错误与标准输出,并配合 pm2-logrotate 做按天/大小轮转与压缩。
- 小提示:若采用应用内轮转,通常不再让 systemd 或 PM2 再次轮转同一文件,避免重复切割与句柄问题。
上述方式覆盖 systemd 与 PM2 的常见用法,便于在 Debian 上统一运维与排查。