Ubuntu系统配置Node.js日志输出的常见方法
console模块(基础调试)Node.js内置的console.log()、console.error()等方法是最简单的日志输出方式,适合开发阶段快速查看信息。日志默认输出到终端,可通过重定向到文件保存(如node app.js > app.log 2>&1)。但这种方式缺乏日志级别、格式化等功能,不适合生产环境。
Winston是Node.js最流行的日志库,支持多传输方式(控制台、文件、HTTP等)、日志级别(info/warn/error等)和自定义格式。
npm install winstonconst winston = require('winston');
const logger = winston.createLogger({
level: process.env.LOG_LEVEL || 'info', // 通过环境变量控制日志级别
format: winston.format.combine(
winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }), // 添加时间戳
winston.format.json() // 结构化输出(便于后续分析)
),
transports: [
new winston.transports.Console(), // 输出到控制台(开发环境)
new winston.transports.File({ filename: 'error.log', level: 'error' }), // 错误日志单独保存
new winston.transports.File({ filename: 'combined.log' }) // 所有日志合并保存
]
});
// 使用示例
logger.info('Application started');
logger.error('Database connection failed');
winston-daily-rotate-file插件,配置按天分割日志:const DailyRotateFile = require('winston-daily-rotate-file');
const transport = new DailyRotateFile({
filename: 'application-%DATE%.log', // 文件名包含日期
datePattern: 'YYYY-MM-DD', // 按天分割
zippedArchive: true, // 压缩旧日志
maxSize: '20m', // 单个文件最大20MB
maxFiles: '14d' // 保留14天
});
logger.add(transport);
Pino以高性能著称,适合高负载应用,支持JSON格式输出和流式处理。
npm install pinoconst pino = require('pino')();
pino.info('Hello, world!');
pino.error('Something went wrong');
Log4js是功能丰富的日志库,支持日志分级(trace/debug/info等)、文件轮转和多种输出目标。
npm install log4jsconst log4js = require('log4js');
log4js.configure({
appenders: {
console: { type: 'console' }, // 控制台输出
file: {
type: 'file',
filename: 'logs/app.log',
pattern: '-yyyy-MM-dd', // 按天分割
alwaysIncludePattern: true,
daysToKeep: 90, // 保留90天
compress: true // 压缩旧日志
}
},
categories: {
default: { appenders: ['console', 'file'], level: 'info' } // 默认日志级别
}
});
const logger = log4js.getLogger();
logger.info('Application initialized');
PM2是Node.js进程管理工具,可自动重启应用、管理日志,并提供日志轮转功能。
npm install pm2 -gpm2 start app.js --name my-app --log-date-format "YYYY-MM-DD HH:mm Z" # 添加时间戳
pm2 logs my-apppm2 save + pm2 logs > all.logpm2 set pm2-logrotate:max_size 10M # 单个日志文件最大10MB
pm2 set pm2-logrotate:retain 7 # 保留7天
将Node.js日志发送到Ubuntu的Rsyslog系统日志服务,便于统一管理所有系统日志。
winston-syslog模块:npm install winston-syslogconst winston = require('winston');
require('winston-syslog').Syslog;
const logger = winston.createLogger({
transports: [
new winston.transports.Syslog({
host: 'localhost', // 本地系统日志服务器
port: 514,
protocol: 'udp', // 或'tcp'
facility: 'user', // 日志设施(如user/local0)
appName: 'my-node-app', // 应用名称(在系统日志中标识)
level: 'info'
})
]
});
logger.info('Log sent to system log');
journalctl -u my-node-app(若配置了syslog标识)或tail -f /var/log/syslog。通过环境变量灵活调整日志级别、输出路径等参数,适应不同环境(开发/测试/生产)。
const winston = require('winston');
const logLevel = process.env.LOG_LEVEL || 'info'; // 默认info级别
const logPath = process.env.LOG_PATH || './logs'; // 默认日志路径
const logger = winston.createLogger({
level: logLevel,
format: winston.format.combine(
winston.format.timestamp(),
winston.format.json()
),
transports: [
new winston.transports.Console(),
new winston.transports.File({ filename: `${logPath}/combined.log` }),
new winston.transports.File({
filename: `${logPath}/error.log`,
level: 'error'
})
]
});
LOG_LEVEL=debug LOG_PATH=./logs node app.js
以上方法可根据应用场景组合使用(如Winston+PM2+日志轮转),实现灵活、高效的日志管理。生产环境建议优先选择Winston或Pino搭配PM2,兼顾性能和易用性。