Ubuntu 上 Node.js 日志监控实操指南
一 本地实时查看与过滤
tail -f /var/log/myapp.log;配合 grep 做关键字过滤:tail -f /var/log/myapp.log | grep 'ERROR';用 watch 定时刷新末尾内容:watch -n 2 "tail -n 20 /var/log/myapp.log"。sudo apt-get install multitail 后执行 multitail /var/log/myapp.log。nodemon app.js(更适合开发环境)。二 使用进程管理器 PM2 统一收集与轮转
sudo npm install -g pm2,随后 pm2 start app.js --name my-api。pm2 logs 查看所有应用日志;pm2 logs my-api 查看指定应用;pm2 logs --raw 显示原始输出;pm2 logs | grep error 过滤关键字。pm2 logrotate 配置按大小/时间切分,避免单文件过大。三 结构化日志与系统日志集成
npm install winstonconst 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' }),
new winston.transports.Console()
]
});
logger.info('Server started', { port: 3000 });
logger.error('DB connection failed', { err: err.message });
npm install winston syslog-transportconst winston = require('winston');
const SyslogTransport = require('syslog-transport');
const logger = winston.createLogger({
transports: [
new SyslogTransport({
host: 'localhost',
app_name: 'my-node-app',
facility: 'local0'
})
]
});
logger.info('Hello, syslog');
journalctl -u my-node-app -f(按服务名实时跟踪)。四 集中式日志平台搭建与远程转发
方案对比
| 方案 | 组件与部署 | 关键配置 | 适用场景 |
|---|---|---|---|
| ELK | Elasticsearch + Logstash + Kibana | Logstash 从文件采集并写入 ES;Kibana 建立索引模式与可视化 | 复杂查询、全文检索、可视化分析 |
| EFK | Elasticsearch + Fluentd + Kibana | Fluentd 以 tail 采集并输出到 ES;Kibana 展示 | 轻量采集、云原生友好 |
| Syslog 远程 | rsyslog/syslog-ng → 远程日志服务器 | 将应用或系统日志通过 UDP/TCP 发送到集中日志主机 | 合规审计、统一落盘与转发 |
快速上手示例
input { file { path => "/var/log/myapp/*.log" start_position => "beginning" } }
output { elasticsearch { hosts => ["localhost:9200"] index => "nodejs-logs-%{+YYYY.MM.dd}" } }
启动后在 http://<kibana_ip>:5601 配置索引模式查看。<source>
@type tail
path /var/log/myapp/*.log
pos_file /var/log/td-agent/nodejs.log.pos
tag nodejs.log
<parse> @type none </parse>
</source>
<match nodejs.log>
@type elasticsearch
host localhost
port 9200
logstash_format true
flush_interval 10s
</match>
*.* @<remote_ip>:514(UDP),或使用 syslog-ng 定义 destination 与 log 路径;重启服务后生效。五 生产落地建议
tail -f 或 pm2 logs 定位,再查 journalctl 与系统资源,最后在 ELK/EFK 回溯历史与上下文。