1. 选择合适的日志库
Debian环境下,Node.js常用的日志库各有优势:Winston功能全面,支持多传输方式(文件、控制台、系统日志等)和灵活配置,是大多数场景的首选;Pino以高性能著称,适合对日志写入速度要求高的生产环境;Bunyan默认输出结构化JSON日志,便于后续分析;Log4js不依赖运行时框架,配置灵活,适合复杂应用。根据项目需求(如性能、结构化需求)选择合适的库。
2. 基础日志配置方法
以Winston为例,基础配置需包含日志级别、输出格式和传输目标。以下是一个兼顾开发与生产的配置示例:
const { createLogger, format, transports } = require('winston');
const logger = createLogger({
level: process.env.NODE_ENV === 'production' ? 'info' : 'debug', // 生产环境用info,开发环境用debug
format: format.combine(
format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }), // 添加时间戳
format.printf(({ timestamp, level, message }) => `${timestamp} [${level}]: ${message}`) // 自定义输出格式
),
transports: [
new transports.Console(), // 开发环境输出到控制台
new transports.File({ filename: 'logs/error.log', level: 'error' }), // 错误日志单独存文件
new transports.File({ filename: 'logs/combined.log' }) // 所有日志合并存文件
]
});
module.exports = logger;
在应用中引入后,可通过logger.info()、logger.error()等方法记录日志。
3. 日志轮转与归档
为避免日志文件过大占用磁盘空间,需启用日志轮转。常用方法有两种:
winston-daily-rotate-file库,配置每日生成新日志文件并压缩旧文件:const DailyRotateFile = require('winston-daily-rotate-file');
const transport = new DailyRotateFile({
filename: 'logs/application-%DATE%.log', // 日志文件名包含日期
datePattern: 'YYYY-MM-DD', // 按天分割
zippedArchive: true, // 压缩旧日志
maxSize: '20m', // 单个文件最大20MB
maxFiles: '14d' // 保留14天内的日志
});
logger.add(transport);
logrotate(Debian自带)配置日志轮转,编辑/etc/logrotate.d/nodejs文件:/path/to/your/nodejs/logs/*.log {
daily # 每日轮转
rotate 7 # 保留7天
compress # 压缩旧日志
missingok # 文件不存在不报错
notifempty # 日志为空不轮转
create 0640 root adm # 新日志文件权限
}
测试配置是否正确:logrotate -d /etc/logrotate.d/nodejs(模拟运行),强制运行:logrotate -f /etc/logrotate.d/nodejs。4. 使用PM2管理日志
PM2是Node.js进程管理工具,可简化日志管理流程。安装PM2:sudo npm install -g pm2,启动应用时指定日志文件:
pm2 start app.js --name "my-node-app" --error "logs/err.log" --output "logs/out.log"
或通过配置文件(ecosystem.config.js):
module.exports = {
apps: [{
name: 'my-node-app',
script: 'app.js',
error_file: 'logs/err.log',
out_file: 'logs/out.log'
}]
};
常用日志命令:pm2 logs(查看实时日志)、pm2 logs my-node-app(查看指定应用日志)、pm2 flush(清空日志)。
5. 集中式日志管理
生产环境中,建议将日志发送到集中式日志管理系统,便于统一分析和监控。常用方案:
LogstashTransport或filebeat),Elasticsearch存储索引,Kibana可视化分析;6. 日志级别与环境适配
通过环境变量控制日志级别,适应不同环境需求:
NODE_ENV=development):设置为debug,输出详细日志(如请求参数、内部状态);NODE_ENV=production):设置为info或warn,仅输出关键信息(如请求耗时、错误堆栈),减少日志量。const logger = createLogger({
level: process.env.NODE_ENV === 'production' ? 'info' : 'debug',
// ...其他配置
});
7. 权限与安全配置
确保日志文件的权限正确,防止未授权访问:
sudo chown -R nodeuser:nodegroup /path/to/logs(nodeuser为运行Node.js的用户,nodegroup为用户组);sudo chmod -R 640 /path/to/logs/*.log(所有者可读写,组用户可读,其他用户无权限)。format过滤敏感字段。