Debian系统下Node.js日志配置指南
在Debian系统中,Node.js日志配置需根据生产/开发环境需求选择合适方案,核心目标是将日志结构化、持久化,并实现高效管理。以下是常见配置方法及步骤:
console模块最简单的日志方式是使用Node.js内置的console.log/console.error,适用于开发调试。若需将日志写入文件,可通过重定向或自定义函数实现:
const fs = require('fs');
const path = require('path');
const logFile = path.join(__dirname, 'app.log');
// 自定义日志函数(带时间戳)
function logToFile(message) {
const timestamp = new Date().toISOString();
const logEntry = `${timestamp}: ${message}\n`;
fs.appendFile(logFile, logEntry, (err) => {
if (err) throw err;
});
}
// 重写console.log
console.log = (...args) => {
const message = args.join(' ');
logToFile(message); // 写入文件
process.stdout.write(message + '\n'); // 同时输出到控制台
};
// 示例使用
console.log('Hello, world!');
缺点:缺乏日志级别、格式化、轮转等功能,不适合生产环境。
Winston是Node.js最流行的日志库,支持多传输(文件、控制台、Syslog等)、格式化(JSON/文本)和日志级别。
npm install winstonconst { createLogger, format, transports } = require('winston');
const path = require('path');
const logger = createLogger({
level: process.env.LOG_LEVEL || 'info', // 通过环境变量动态设置级别
format: format.combine(
format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
format.json() // 生产环境建议用JSON格式(便于ELK等工具分析)
),
transports: [
new transports.File({ filename: path.join(__dirname, 'logs/error.log'), level: 'error' }), // 错误日志单独存储
new transports.File({ filename: path.join(__dirname, 'logs/combined.log') }), // 所有日志合并
...(process.env.NODE_ENV !== 'production' ? [ // 开发环境输出到控制台
new transports.Console({ format: format.simple() })
] : [])
]
});
// 示例使用
logger.info('Application started');
logger.error('Database connection failed');
Pino专注于高性能,日志输出为JSON格式,适合对性能敏感的生产环境。
npm install pino pino-prettyconst pino = require('pino');
const path = require('path');
// 生产环境:写入文件
const logger = pino({ level: 'info' }, pino.destination(path.join(__dirname, 'logs/app.log')));
// 开发环境:输出到控制台(美化格式)
if (process.env.NODE_ENV !== 'production') {
logger.level = 'debug';
logger = pino({ level: 'debug' }, pino.destination(process.stdout));
}
// 示例使用
logger.info('User logged in', { userId: 123 });
logger.error('Invalid API key', { apiKey: 'abc123' });
使用logrotate工具自动轮转、压缩和删除旧日志,避免日志文件占用过多磁盘空间。
sudo apt install logrotate/etc/logrotate.d/nodejs文件,内容如下:/path/to/your/nodejs/logs/*.log {
daily # 每天轮转
rotate 7 # 保留7天日志
compress # 压缩旧日志(如.gz格式)
missingok # 若日志文件不存在也不报错
notifempty # 若日志为空则不轮转
create 0644 root root # 新日志文件权限
}
logrotate -d /etc/logrotate.d/nodejs(模拟运行,检查配置是否正确);logrotate -f /etc/logrotate.d/nodejs(强制立即轮转)。PM2是Node.js进程管理工具,可自动重启应用并管理日志,适合生产环境。
npm install pm2 -gpm2 start app.js --name "my-app" \
--log /var/log/my-app.log \ # 合并日志路径
--error /var/log/my-app-error.log # 错误日志路径
pm2 logs my-app(实时日志);pm2 logs my-app --lines 100(查看最近100条)。ecosystem.config.js配置:module.exports = {
apps: [{
name: 'my-app',
script: 'app.js',
error_file: '/var/log/my-app-error.log',
out_file: '/var/log/my-app.log',
log_date_format: 'YYYY-MM-DD HH:mm Z'
}]
};
将Node.js日志发送到Debian系统的Syslog(集中管理所有系统日志),适合需要统一日志管理的场景。
npm install winston-syslogconst winston = require('winston');
const Syslog = require('winston-syslog').Syslog;
const logger = winston.createLogger({
level: 'info',
format: winston.format.json(),
transports: [
new Syslog({
host: 'localhost', // Syslog服务器地址(本地则为localhost)
port: 514, // Syslog端口(默认UDP 514)
app_name: 'my-node-app', // 应用名称(在Syslog中标识)
facility: 'local0', // 设施类型(如local0-local7)
eol: '\n' // 行结束符
})
]
});
// 示例使用
logger.info('Application started', { pid: process.pid });
journalctl -t my-node-app(过滤应用名称);tail -f /var/log/syslog(查看系统日志)。通过环境变量动态调整日志级别,无需修改代码即可适应不同环境(开发/测试/生产)。
const winston = require('winston');
const logger = winston.createLogger({
level: process.env.LOG_LEVEL || 'info', // 默认info级别
format: winston.format.json(),
transports: [new winston.transports.Console()]
});
// 启动应用时设置环境变量
// 生产环境:LOG_LEVEL=error node app.js
// 开发环境:LOG_LEVEL=debug node app.js
通过代码或配置文件指定日志存储位置,确保日志文件存放在合适目录(如/var/log)。
const path = require('path');
const winston = require('winston');
const logger = winston.createLogger({
transports: [
new winston.transports.File({
filename: path.join('/var/log', 'my-app', 'combined.log') // 绝对路径
})
]
});
{
"logPath": "/var/log/my-app/app.log"
}
代码中读取:const config = require('./config.json');
const logPath = path.resolve(__dirname, config.logPath);
sudo chown -R nodeuser:nodegroup /var/log/my-app)。以上方法覆盖了Debian系统下Node.js日志配置的主要场景,可根据应用规模、性能需求选择合适的方案。生产环境推荐使用Winston/Pino+PM2+logrotate组合,实现日志的结构化、持久化和高效管理。