如何在Ubuntu上监控Node.js日志
在Ubuntu系统中,监控Node.js日志可通过命令行工具、进程管理器或集中式日志管理方案实现,以下是具体方法:
tail实时查看日志文件若Node.js应用将日志输出到文件(如/var/log/myapp.log),可通过tail -f命令实时跟踪日志更新:
tail -f /var/log/myapp.log
该命令会持续显示日志文件的最后几行,新内容会实时追加显示。适用于快速查看实时日志的场景。
journalctl查看系统日志若Node.js应用以系统服务运行(如通过systemd管理),可使用journalctl查看其日志:
journalctl -u your-nodejs-service-name -f
其中your-nodejs-service-name是服务的名称(启动时通过--name指定或服务文件中的Name字段)。-f参数表示实时跟踪日志。适用于系统级日志管理。
PM2是Node.js常用的进程管理工具,内置日志管理和监控功能:
npm install pm2 -g # 全局安装PM2
pm2 start app.js --name my-app # 启动应用并命名为"my-app"
pm2 logs my-app # 查看"my-app"的实时日志(合并stdout和stderr)
pm2 logs my-app --lines 50 # 查看最后50行日志
PM2默认自动轮转日志(保留7天,每文件最大10MB),也可手动配置:
pm2 set pm2-logrotate:max_size 10M # 单个日志文件最大10MB
pm2 set pm2-logrotate:retain 7 # 保留最近7天日志
PM2会将日志存储在~/.pm2/logs/目录下(文件名为应用名-out.log和应用名-err.log)。适用于生产环境的进程管理和日志监控。
当日志文件过大时,需通过logrotate工具定期轮转、压缩和清理日志:
sudo apt-get install logrotate
在/etc/logrotate.d/目录下创建my-app配置文件:
sudo nano /etc/logrotate.d/my-app
添加以下内容(以/var/log/myapp.log为例):
/var/log/myapp.log {
daily # 每天轮转
rotate 7 # 保留7天日志
compress # 压缩旧日志(如.gz格式)
missingok # 若日志不存在也不报错
notifempty # 若日志为空则不轮转
create 0640 root adm # 新日志文件权限和所有者
}
sudo logrotate -f /etc/logrotate.d/my-app # 强制立即轮转
适用于需要自动化管理日志大小的场景。
对于分布式或大规模应用,建议使用ELK Stack(Elasticsearch+Logstash+Kibana)或Fluentd实现集中式日志收集、分析和可视化。
sudo apt-get install elasticsearch logstash kibana
/etc/logstash/conf.d/nodejs.conf文件,内容如下:input {
file {
path => "/var/log/myapp.log"
start_position => "beginning"
}
}
output {
elasticsearch {
hosts => ["localhost:9200"]
index => "nodejs-logs-%{+YYYY.MM.dd}"
}
}
sudo systemctl start elasticsearch logstash kibana
http://服务器IP:5601,配置索引模式(如nodejs-logs-*)即可可视化日志。sudo apt-get install fluentd
/etc/td-agent/td-agent.conf文件:source @type tail
path /var/log/myapp.log
pos_file /var/log/td-agent/nodejs.log.pos
tag nodejs
parse @type none
match nodejs
@type elasticsearch
host localhost
port 9200
logstash_format true
flush_interval 10s
sudo systemctl start td-agent
适用于需要高吞吐量和灵活集成的场景。
通过Winston或Bunyan等日志库,可实现日志分级(info/error/debug)、多输出目标(文件/控制台/远程服务器)和格式化(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' }),
new winston.transports.Console()
]
});
logger.info('This is an info log');
logger.error('This is an error log');
npm install bunyan
const bunyan = require('bunyan');
const logger = bunyan.createLogger({
name: 'myapp',
streams: [
{ level: 'info', stream: process.stdout },
{ level: 'error', path: 'app-error.log' }
]
});
logger.info('This is an info log');
logger.error('This is an error log');
适用于需要结构化日志和高级功能的场景。
以上方法可根据需求选择:基础监控用tail或journalctl,生产环境用PM2,大规模应用用ELK/Fluentd,复杂日志需求用Winston/Bunyan。