console模块Node.js内置的console模块是最简单的日志记录方式,适合开发调试。通过console.log()输出普通信息,console.error()输出错误信息,日志会直接显示在终端或重定向到文件(如node app.js > app.log 2>&1)。但这种方式缺乏日志级别、格式化和长期管理功能,仅适用于临时调试。
第三方日志库提供了日志级别、格式化、传输(文件/控制台/HTTP)等功能,适合生产环境:
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' }), // 所有日志合并
    new winston.transports.Console({ format: winston.format.simple() }) // 控制台输出(开发环境)
  ]
});
logger.info('Application started'); // 记录info日志
const bunyan = require('bunyan');
const logger = bunyan.createLogger({ name: 'myapp' }); // 日志名称
logger.info({ user: 'John' }, 'User logged in'); // 带上下文的日志
const pino = require('pino')();
pino.info('This is a log message'); // 自动添加时间戳、日志级别
const log4js = require('log4js');
log4js.configure({
  appenders: {
    file: { type: 'file', filename: 'app.log', pattern: '-yyyy-MM-dd', keepFileExt: true }, // 按天轮转
    console: { type: 'console' }
  },
  categories: { default: { appenders: ['file', 'console'], level: 'info' } }
});
const logger = log4js.getLogger();
logger.info('Log4js is working');
这些库均支持日志级别过滤(如仅记录error及以上级别)、结构化日志(便于ELK等工具分析)和多传输目标(文件+控制台+远程服务器)。
当日志文件过大时,需通过轮转分割文件,避免占用过多磁盘空间。Ubuntu下常用logrotate工具:
sudo apt-get install logrotate/etc/logrotate.d/nodejs文件,添加以下内容(针对Node.js日志目录):/var/log/nodejs/*.log {
  daily                # 每天轮转
  missingok            # 日志文件不存在时不报错
  rotate 7             # 保留最近7天的日志
  compress             # 压缩旧日志(.gz格式)
  notifempty           # 日志为空时不轮转
  create 0640 root adm # 新日志文件权限
}
sudo logrotate -vf /etc/logrotate.d/nodejs(强制立即轮转)。winston-daily-rotate-file插件)实现。PM2是Node.js进程管理工具,内置日志管理功能,适合生产环境:
sudo npm install pm2 -gpm2 start app.js --name my-app(自动生成out.log(标准输出)和err.log(错误输出))pm2 logs my-app:实时查看日志(--lines 100限制行数,--follow持续跟踪)pm2 logs --json:以JSON格式输出(便于后续处理)pm2 flush:清空当前日志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', // 日志时间格式
    merge_logs: true, // 合并stdout和stderr
    log_rotation: true, // 开启轮转
    log_rotation_interval: '1d', // 每天轮转
    log_rotation_size: '10M', // 单个文件超过10M时轮转
    log_rotation_keep: 7 // 保留7个轮转文件
  }]
};
启动:pm2 start ecosystem.config.js。将Node.js日志发送到系统日志(/var/log/syslog或/var/log/messages),统一管理:
sudo apt-get install rsyslog(Ubuntu默认安装)/etc/rsyslog.d/50-default.conf,添加以下内容(将node程序的日志发送到/var/log/nodejs.log):if $programname == 'node' then /var/log/nodejs.log
& stop # 停止后续处理(避免重复记录)
sudo systemctl restart rsyslogtail -f /var/log/nodejs.log。transports.Console或winston-syslog插件)。对于大规模应用,可使用日志分析平台实现集中存储、可视化和告警:
file input插件),Elasticsearch存储并索引,Kibana可视化分析(如错误趋势、请求耗时)。file input插件,解析JSON格式日志(Winston/Bunyan输出的JSON可直接解析)。winston-graylog2或bunyan-graylog插件发送GELF格式日志到Graylog服务器。promtail收集日志(支持Node.js JSON格式),发送到Loki,通过Grafana展示日志面板。以上方案覆盖了Ubuntu下Node.js日志管理的记录、轮转、进程管理、系统集成、分析全流程,可根据应用规模(开发/生产)、需求(简单/复杂)选择合适的组合(如开发用console+Winston,生产用PM2+logrotate+ELK)。