Ubuntu 上 Node.js 日志管理实操指南
一 日志生成与结构化
- 开发阶段可直接使用 console,但生产环境建议使用具备日志级别、结构化输出与多目标的库。
- 常用方案与要点:
- Winston:多传输(文件、控制台、HTTP 等)、可分级、可 JSON;适合复杂应用。
- Bunyan:原生 JSON、便于检索与分析。
- Pino:高性能,常与 pino-pretty 配合在本地美化输出。
- Morgan(Express 中间件):专门记录 HTTP 请求日志(方法、URL、状态码等)。
- 快速示例(Winston,生产建议 JSON,开发输出到控制台):
- 安装:
npm install winston
- 配置:
- const winston = require(‘winston’);
const logger = winston.createLogger({
level: ‘info’,
format: winston.format.json(),
transports: [
new winston.transports.File({ filename: ‘error.log’, level: ‘error’ }),
new winston.transports.File({ filename: ‘combined.log’ }),
…(process.env.NODE_ENV !== ‘production’
? [new winston.transports.Console({ format: winston.format.simple() })]
: [])
]
});
- 使用:
logger.info('Server started', { port: 3000 }); logger.error('DB failed', { err });
- Express 请求日志(Morgan):
app.use(morgan('combined'));。
二 日志轮转与保留策略
- 应用内轮转(代码可控,适合容器或无 systemd 场景)
- Winston 插件 winston-daily-rotate-file:
- 安装:
npm install winston-daily-rotate-file
- 配置示例:
- const DailyRotateFile = require(‘winston-daily-rotate-file’);
const transport = new DailyRotateFile({
filename: ‘application-%DATE%.log’,
datePattern: ‘YYYY-MM-DD’,
zippedArchive: true,
maxSize: ‘20m’,
maxFiles: ‘14d’
});
- 系统级轮转(Ubuntu 自带 logrotate,无需改代码,适合系统服务/物理机)
- 创建配置:
sudo nano /etc/logrotate.d/nodejs
- 示例(管理 /var/log/nodejs/*.log):
- /var/log/nodejs/*.log {
daily
missingok
rotate 7
compress
notifempty
create 0640 root adm
}
- 测试:
sudo logrotate -f /etc/logrotate.d/nodejs
- 进程管理工具 PM2 内置日志轮转
- 启动:
pm2 start app.js --name my-app
- 查看:
pm2 logs my-app、pm2 logs my-app --lines 100
- 配置文件(ecosystem.config.js):
- module.exports = {
apps: [{
name: ‘my-app’,
script: ‘app.js’,
log_date_format: ‘YYYY-MM-DD HH:mm Z’,
out_file: ‘/var/log/nodejs/my-app-out.log’,
error_file: ‘/var/log/nodejs/my-app-err.log’,
max_size: ‘10M’,
retain: 7,
merge_logs: true
}]
};
- 启动:
pm2 start ecosystem.config.js
- 也可通过内置模块设置:
pm2 set pm2-logrotate:max_size 10M、pm2 set pm2-logrotate:retain 7。
三 集中式日志与系统日志
- 集中式分析(适合多服务/分布式)
- ELK Stack(Elasticsearch + Logstash + Kibana):
- 安装:
sudo apt-get install elasticsearch logstash kibana
- Logstash 示例(/etc/logstash/conf.d/nodejs.conf):
- input { file { path => “/var/log/nodejs/*.log”; start_position => “beginning” } }
- filter {
grok { match => { “message” => “%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:loglevel} %{GREEDYDATA:logmessage}” } }
date { match => [“timestamp”, “ISO8601”] }
}
- output { elasticsearch { hosts => [“localhost:9200”] }; stdout { codec => rubydebug } }
- 启动:
sudo systemctl start logstash
- 访问 Kibana(默认端口 5601)创建索引模式并分析日志。
- 系统日志(写入 syslog,由 rsyslog 统一管理)
- Node.js 示例(syslog):
- const syslog = require(‘syslog’);
syslog.openlog(‘my-app’, { facility: syslog.LOG_USER, tag: ‘my-app’ });
syslog.syslog(syslog.LOG_INFO, ‘Service started’);
syslog.closelog();
- rsyslog 配置(/etc/rsyslog.d/50-default.conf 或自定义):
- if $programname == ‘my-app’ then /var/log/my-app.log
- & stop
- 重启:
sudo systemctl restart rsyslog
- 也可选用 Graylog 等集中式方案。
四 监控查看与日常维护
- 实时查看
- PM2:
pm2 logs my-app、pm2 logs my-app --lines 100、pm2 logs my-app --clear
- 系统日志:
tail -f /var/log/nodejs/my-app.log
- 清理与保留
- 优先依赖 logrotate 或 PM2 的轮转与保留策略(如保留 7 天、按 10M 分割、压缩归档),避免手工删除正在写入的日志。
- 如需自定义清理脚本,可结合 cron 定期删除过期文件,但更推荐用成熟的轮转工具以避免误删与句柄问题。
五 实践建议
- 开发环境:使用 console 或 Pino + pino-pretty 便于本地调试;Express 搭配 Morgan 记录请求日志。
- 生产环境:使用 Winston/Bunyan/Pino 输出结构化 JSON;按大小或日期轮转(如 10M 或 1d);错误日志与业务日志分离;必要时写入 syslog 或接入 ELK/Graylog 做检索与可视化。
- 运行方式:优先用 PM2 托管进程并统一查看/轮转日志;在容器/无 systemd 场景使用应用内轮转(如 winston-daily-rotate-file)。