Node.js在Ubuntu中的日志管理方案
Node.js内置console模块可用于快速输出日志(如console.log()、console.error()),但更适合开发调试。生产环境中建议使用第三方日志库,提供更强大的功能(如日志级别、格式化、多输出目标):
info、error)和JSON格式输出。示例配置: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' }) // 所有日志合并
]
});
if (process.env.NODE_ENV !== 'production') {
logger.add(new winston.transports.Console({ format: winston.format.simple() })); // 开发环境输出到控制台
}
const bunyan = require('bunyan');
const logger = bunyan.createLogger({ name: 'my-app', level: 'info' });
logger.info('This is an info log'); // 输出JSON格式日志
日志轮转可自动分割日志文件(按大小或时间),压缩旧日志并保留指定数量,避免磁盘空间耗尽。常见方法:
const DailyRotateFile = require('winston-daily-rotate-file');
const transport = new DailyRotateFile({
filename: 'application-%DATE%.log', // 日志文件名模板(%DATE%替换为日期)
datePattern: 'YYYY-MM-DD', // 按天分割
zippedArchive: true, // 压缩旧日志
maxSize: '20m', // 单个文件最大20MB
maxFiles: '14d' // 保留14天日志
});
const logger = winston.createLogger({ transports: [transport] });
/etc/logrotate.d/nodejs:/var/log/nodejs/*.log {
daily # 每天轮转
missingok # 文件不存在时不报错
rotate 7 # 保留7天日志
compress # 压缩旧日志
notifempty # 日志为空时不轮转
create 0640 root adm # 新日志文件权限
}
使用PM2(进程管理器)可简化Node.js应用管理,提供日志收集、实时查看、自动重启等功能:
npm install pm2 -g,启动应用:pm2 start app.js --name my-app。pm2 logs my-app(实时查看所有日志);pm2 logs my-app --lines 100(查看最近100行)。ecosystem.config.js自定义日志路径和轮转: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', // 日志时间格式
log_rotation: true, // 启用轮转
log_rotation_interval: '1d', // 每天轮转
log_rotation_size: '10M' // 单个文件最大10MB
}]
};
对于生产环境,建议使用集中式日志管理(如ELK Stack、Graylog),将日志收集、存储、分析统一管理:
winston-logstash库):const winston = require('winston');
const Logstash = require('winston-logstash').Logstash;
const logger = winston.createLogger({
transports: [
new Logstash({ port: 5000, host: 'localhost' }) // 连接到本地的Logstash服务
]
});
logs子目录(如./logs/app.log)。filename选项、PM2的out_file配置)。mkdir -p /var/log/nodejs && chown -R $USER:adm /var/log/nodejs),避免权限问题导致日志无法写入。