您的位置:首页 >Node.js应用如何在Ubuntu上进行日志管理
发布于2026-05-03 阅读(0)
扫一扫,手机访问
日志,是应用运行状态的忠实记录者,也是排查问题的第一现场。在 Ubuntu 上部署 Node.js 应用,一套清晰、高效的日志管理策略,能让运维工作事半功倍。下面,我们就来梳理一下从输出、轮转到监控、分析的完整实践路径。
首先,得决定日志往哪儿写。方法有好几种,各有适用场景。
node app.js > app.log 2>&1)来持久化。这种方式胜在简单,但缺点也很明显:缺乏日志级别区分和结构化能力,后期分析比较麻烦。~/.pm2/logs/ 下(比如 app-out.log 和 app-error.log)。当然,你也可以在配置文件中自定义输出路径。/var/log/syslog 或 journalctl 命令来查看,适合需要与系统服务日志整合的场景。./logs,或者系统级的集中目录如 /var/log/nodejs/。这样做的好处是避免与系统日志混杂,便于进行独立的权限设置和生命周期管理。日志文件不能任由其无限增长,否则迟早会撑满磁盘。因此,日志轮转(Log Rotation)至关重要。
pm2 set pm2-logrotate:max_size 10M 和 pm2 set pm2-logrotate:retain 7 即可。log_rotation: truelog_rotation_interval: ‘1d’log_rotation_size: ‘10M’log_rotation_keep: 7/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:每隔2秒刷新并显示日志尾部,适合在固定终端窗口观察。pm2 logs my-app 实时查看;pm2 logs --json 以 JSON 格式输出;pm2 flush 清空当前日志文件(谨慎使用)。journalctl -u your-nodejs-service -f 可以实时跟踪该服务的所有日志输出。morgan 中间件将 HTTP 访问日志写入单独的 access.log,能极大方便定位 4xx 客户端错误或 5xx 服务器错误。随着应用规模扩大,日志管理需要更进一步。
jq 命令解析,还是导入日志平台,都变得异常轻松。winston-syslog 或 Node.js 内置的 syslog 模块,将应用日志直接发送到 rsyslog 或 journald。这样一来,所有日志都由操作系统层面的工具统一收集、存储和轮转,管理起来更规范。理论说了不少,最后来看一套能直接上手、用于生产环境的最小化配置组合。这可以作为一个坚实的起点。
sudo mkdir -p /var/log/nodejs
sudo chown $USER:$USER /var/log/nodejs
npm i winston winston-daily-rotate-fileconst 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() })]
: [])
]
});
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
}]
};
[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
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
9