Ubuntu下Node.js日志管理指南
在Ubuntu系统中,Node.js日志管理需覆盖基础记录、格式规范、轮转压缩、进程监控及集中分析等环节。以下是常用方法及工具的具体实现:
console模块(开发/调试首选)Node.js内置的console模块提供log()、error()、warn()等方法,直接输出到控制台,适合快速验证程序逻辑。
示例:
const express = require('express');
const app = express();
app.get('/', (req, res) => {
console.log('Received request at /'); // 记录普通信息
res.send('Hello World!');
});
app.listen(3000, () => {
console.log('Server running on port 3000'); // 记录启动信息
});
局限性:无法区分日志级别、无结构化格式,不适合生产环境。
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({ format: winston.format.simple() }) // 开发环境输出到控制台
]
});
logger.info('Server started on port 3000');
logger.error('Database connection failed');
const bunyan = require('bunyan');
const logger = bunyan.createLogger({ name: 'my-app', level: 'info' });
logger.info('User logged in', { userId: 123 }); // 包含额外字段的结构化日志
const morgan = require('morgan');
app.use(morgan('combined')); // 使用Apache标准格式
以上库均通过npm install安装,可根据需求选择。
当日志文件过大时,需通过轮转分割文件,避免占用过多磁盘空间。常用工具为logrotate(Ubuntu系统自带)。
/etc/logrotate.d/nodejs配置文件:sudo nano /etc/logrotate.d/nodejs
/var/log/nodejs/目录下的所有.log文件):/var/log/nodejs/*.log {
daily # 每天轮转
missingok # 文件丢失不报错
rotate 7 # 保留7个旧日志
compress # 压缩旧日志(gzip)
notifempty # 空文件不轮转
create 0640 root adm # 新日志权限及属主
}
sudo logrotate -f /etc/logrotate.d/nodejs
说明:若应用日志路径不在/var/log/nodejs/,需修改*.log前的路径为实际路径。
PM2是Node.js进程管理工具,内置日志管理功能,支持日志聚合、实时查看、自动轮转,适合生产环境。
sudo npm install pm2 -g
pm2 start app.js --name my-app --log /var/log/nodejs/my-app.log
pm2 logs my-app # 实时查看所有日志
pm2 logs my-app --lines 100 # 查看最近100行
ecosystem.config.js:module.exports = {
apps: [{
name: 'my-app',
script: 'app.js',
log_date_format: 'YYYY-MM-DD HH:mm Z', // 日志时间格式
out_file: '/var/log/nodejs/my-app-out.log', // 标准输出日志
error_file: '/var/log/nodejs/my-app-err.log', // 错误输出日志
max_size: '10M', // 单个日志文件最大10MB
retain: 7, // 保留7个轮转文件
merge_logs: true // 合并stdout/stderr
}]
};
启动应用:pm2 start ecosystem.config.js
优势:PM2可管理多进程应用,自动重启崩溃的进程,并集中管理所有日志。
对于分布式系统或需要日志分析、可视化的场景,可使用ELK Stack(Elasticsearch + Logstash + Kibana)实现集中式管理。
sudo apt-get install elasticsearch logstash kibana
/etc/logstash/conf.d/nodejs.conf:input {
file {
path => "/var/log/nodejs/*.log"
start_position => "beginning"
}
}
filter {
grok { match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:loglevel} %{GREEDYDATA:logmessage}" } }
date { match => ["timestamp", "ISO8601"] }
}
output {
elasticsearch { hosts => ["localhost:9200"] }
stdout { codec => rubydebug }
}
sudo systemctl start logstash
filebeat-*)创建索引。优势:ELK支持日志搜索、聚合、可视化(如实时仪表盘),适合复杂系统监控。
syslog模块,或配置rsyslog接收应用层日志。以上方法可根据应用规模(开发/生产)、需求(基础记录/高级分析)灵活组合,实现高效的Node.js日志管理。