Node.js 应用在 Ubuntu 的日志监控技巧
一 日志采集与结构化
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' })
]
});
logger.info('Server started', { port: 3000 });
logger.error('DB connect failed', { err: err.message });
建议始终使用明确的日志级别(如 error、warn、info),并尽量输出结构化字段(如 requestId、userId、path)。二 实时查看与多文件监控
tail -f /var/log/myapp.log
sudo apt-get install multitail
multitail /var/log/myapp.log /var/log/myapp-error.log
sudo npm install -g pm2
pm2 start app.js --name my-app
pm2 logs my-app
以上方式适合本地排查与临时观测,便于快速定位问题。三 日志轮转与保留策略
/path/to/your/nodejs/app/logs/*.log {
daily
missingok
rotate 7
compress
notifempty
create 0640 root adm
}
含义:按天轮转、保留最近 7 天、压缩旧日志、自动创建新文件并设置权限。若使用 PM2,也可启用内置日志轮转(pm2 logrotate)。四 集中化与系统日志集成
sudo npm install winston winston-syslog
配置示例:const winston = require('winston');
const SyslogTransport = require('winston-syslog').SyslogTransport;
const logger = winston.createLogger({
transports: [
new SyslogTransport({ host: 'localhost', app_name: 'my-node-app', facility: 'local0' })
]
});
logger.info('Hello, journald');
查询:journalctl -u my-node-app -f
五 告警与可视化实践
# 过滤错误日志
grep -i 'ERROR' /var/log/myapp.log
# 统计每分钟错误数(按日志时间字段)
grep -i 'ERROR' /var/log/myapp.log | awk -F: '{print $1":"$2}' | sort | uniq -c
通过结构化日志与时间字段,可快速构建错误趋势与异常定位面板。