温馨提示×

Nodejs日志如何输出到文件

小樊
42
2026-08-17 18:08:20
栏目: 编程语言

在 Node.js 中,把日志输出到文件有多种方式,从最简单生产级方案都可以。下面按常见场景给你说明。


一、最简单方式:直接用 fs(不推荐生产)

适合临时调试或简单脚本。

const fs = require('fs');
const path = require('path');

const logFile = path.join(__dirname, 'app.log');

function log(message) {
  const time = new Date().toISOString();
  fs.appendFileSync(logFile, `[${time}] ${message}\n`);
}

log('服务启动');
log('发生错误');

⚠️ 缺点:

  • 同步写文件,性能差
  • 没有日志级别
  • 文件会无限变大

二、使用 console.log + 重定向(适合简单服务)

启动服务时重定向

node app.js > app.log 2>&1
  • >:标准输出
  • 2>&1:错误也写入文件

✅ 优点:简单
❌ 缺点:无法按日期切分、无法控制级别


三、推荐方案:使用日志库(生产环境)

✅ 1. winston(最常用)

安装

npm install winston

示例:输出到文件 + 控制台

const winston = require('winston');

const logger = winston.createLogger({
  level: 'info',
  format: winston.format.combine(
    winston.format.timestamp(),
    winston.format.json()
  ),
  transports: [
    new winston.transports.File({ filename: 'error.log', level: 'error' }),
    new winston.transports.File({ filename: 'combined.log' }),
    new winston.transports.Console()
  ]
});

logger.info('服务启动');
logger.error('发生错误');

✅ 优点:

  • 支持日志级别
  • 支持多文件
  • 可扩展(按天切分、压缩等)

✅ 2. 按日期切分日志(常见需求)

使用 winston-daily-rotate-file

npm install winston-daily-rotate-file
const { createLogger, format, transports } = require('winston');
const DailyRotateFile = require('winston-daily-rotate-file');

const logger = createLogger({
  format: format.combine(
    format.timestamp(),
    format.json()
  ),
  transports: [
    new DailyRotateFile({
      filename: 'logs/app-%DATE%.log',
      datePattern: 'YYYY-MM-DD',
      maxSize: '20m',
      maxFiles: '14d'
    }),
    new transports.Console()
  ]
});

logger.info('按日期输出日志');

四、PM2 管理 Node 服务(强烈推荐)

如果你用 PM2 管理 Node 进程:

pm2 start app.js

PM2 会自动生成日志:

~/.pm2/logs/

查看日志:

pm2 logs

✅ 优点:

  • 自动管理
  • 支持日志切割
  • 不需要改代码

五、方案选择建议

场景 推荐
小脚本 fs / console
普通项目 winston
生产环境 winston + PM2
微服务 winston + ELK

六、日志最佳实践

✅ 不要只写 console.log
✅ 区分 info / warn / error
✅ 错误日志单独文件
✅ 限制日志文件大小
✅ 线上不要输出过多 debug 日志


如果你愿意,可以告诉我:

  • 是否是 Express / Koa / NestJS
  • 是否需要 按天切分
  • 是否用 PM2 / Docker

我可以帮你写一份完整可直接用的日志配置

0