Node.js应用如何在Ubuntu上进行日志管理
导读:Node.js 在 Ubuntu 的日志管理实践 一 日志输出与存储位置 使用内置 console:开发时直接输出到终端;生产可通过重定向持久化,例如:node app.js > app.log 2>&1。该方式简单但...
Node.js 在 Ubuntu 的日志管理实践
一 日志输出与存储位置
- 使用内置 console:开发时直接输出到终端;生产可通过重定向持久化,例如:node app.js > app.log 2> & 1。该方式简单但不具备级别与结构化能力。
- 使用日志库:如 Winston、Bunyan、Pino,支持多传输(文件/控制台/HTTP)、日志级别与结构化(JSON),便于检索与分析。
- 使用进程管理器 PM2:应用日志默认位于用户目录的 ~/.pm2/logs/(如:app-out.log、app-error.log),也可在配置中自定义输出路径。
- 使用系统日志:将日志发送到 syslog/journald,统一由系统管理(/var/log/syslog 或 journalctl)。
- 日志目录建议:应用日志优先写入项目内 ./logs 或集中目录 /var/log/nodejs/,避免与系统日志混放,便于权限与生命周期管理。
二 日志轮转与保留策略
- PM2 内置轮转:启用 log_rotation 并设置按大小或时间切割,例如:
- 命令方式:pm2 set pm2-logrotate:max_size 10M;pm2 set pm2-logrotate:retain 7
- 配置文件方式:
- log_rotation: true
- log_rotation_interval: ‘1d’
- log_rotation_size: ‘10M’
- log_rotation_keep: 7
- 系统级 logrotate:适合统一管理多应用日志,示例配置 /etc/logrotate.d/nodejs:
- /var/log/nodejs/*.log { daily; missingok; rotate 7; compress; notifempty; create 0640 root adm }
- 测试:sudo logrotate -vf /etc/logrotate.d/nodejs
- 日志库自带轮转:如 winston-daily-rotate-file,可按天/小时分割、压缩与保留天数。
三 实时监控与快速排查
- 命令行工具:
- tail -f /path/to/app.log 实时查看;
- grep -i “error” /path/to/app.log 过滤错误;
- watch -n 2 tail -f /path/to/app.log 定期刷新。
- PM2 日志:pm2 logs my-app(实时);pm2 logs --json(结构化输出);pm2 flush(清空当前日志)。
- systemd 服务:journalctl -u your-nodejs-service -f 实时跟踪服务日志。
- Express 请求日志:结合 morgan 写入 access.log,便于定位 4xx/5xx。
四 结构化与集中式日志方案
- 结构化日志:使用 Winston/Bunyan/Pino 输出 JSON,包含 timestamp、level、message、requestId 等字段,便于聚合与检索。
- 系统日志集成:通过 winston-syslog 或 Node.js 内置 syslog 模块将日志发送到 rsyslog/journald,统一由系统收集与轮转。
- 集中式平台:部署 ELK(Elasticsearch+Logstash+Kibana) 或 Graylog/Fluentd,对多实例日志进行采集、索引、可视化与告警。
五 生产可用的最小配置示例
- 目录与权限:sudo mkdir -p /var/log/nodejs & & sudo chown $USER:$USER /var/log/nodejs
- Winston 结构化日志(含按天轮转):
- 安装:npm i winston winston-daily-rotate-file
- 配置示例:
- const winston = require(‘winston’);
const DailyRotateFile = require(‘winston-daily-rotate-file’);
const logger = winston.createLogger({
level: ‘info’,
format: winston.format.json(),
transports: [
new DailyRotateFile({ filename: ‘/var/log/nodejs/error-%DATE%.log’, datePattern: ‘YYYY-MM-DD’, level: ‘error’, zippedArchive: true, maxSize: ‘20m’, maxFiles: ‘14d’ } ),
new DailyRotateFile({ filename: ‘/var/log/nodejs/combined-%DATE%.log’, datePattern: ‘YYYY-MM-DD’, zippedArchive: true, maxSize: ‘20m’, maxFiles: ‘14d’ } ),
…(process.env.NODE_ENV !== ‘production’ ? [new winston.transports.Console({ format: winston.format.simple() } )] : [])
]
} );
- const winston = require(‘winston’);
- PM2 配置(ecosystem.config.js):
- module.exports = {
apps: [{
name: ‘my-app’, script: ‘app.js’,
out_file: ‘/var/log/nodejs/my-app-out.log’, error_file: ‘/var/log/nodejs/my-app-err.log’,
log_date_format: ‘YYYY-MM-DD HH:mm:ss’, merge_logs: true,
log_rotation: true, log_rotation_interval: ‘1d’, log_rotation_size: ‘10M’, log_rotation_keep: 7 } ] } ;
- module.exports = {
apps: [{
name: ‘my-app’, script: ‘app.js’,
- 可选 systemd 服务(/etc/systemd/system/node-app.service):
- [Unit] Description=Node.js App; After=network.target
- [Service] Type=simple; User=www-data; WorkingDirectory=/opt/myapp; ExecStart=/usr/bin/node app.js; StandardOutput=journal; StandardError=journal; Restart=on-failure
- [Install] WantedBy=multi-user.target
- 启用:sudo systemctl daemon-reload & & sudo systemctl enable --now node-app
- 快速验证:pm2 logs my-app -f;tail -f /var/log/nodejs/combined-$(date +%F).log;journalctl -u node-app -f
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: Node.js应用如何在Ubuntu上进行日志管理
本文地址: https://pptw.com/jishu/784544.html
