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,兼顾性能和易用性。