debian

Node.js日志轮转是如何实现的

小樊
37
2025-12-24 06:22:48
栏目: 编程语言

Node.js日志轮转的实现方式

一 核心原理

二 常用实现方案

三 代码示例

const winston = require('winston');
const DailyRotateFile = require('winston-daily-rotate-file');

const transport = new DailyRotateFile({
  filename: 'logs/app-%DATE%.log',   // 文件名含日期占位符
  datePattern: 'YYYY-MM-DD',         // 按天切割
  zippedArchive: true,              // 旧日志压缩
  maxSize: '20m',                   // 单个文件上限
  maxFiles: '14d'                   // 保留14天
});

const logger = winston.createLogger({
  level: 'info',
  format: winston.format.json(),
  transports: [transport]
});

logger.info('hello, winston rotate');
const winston = require('winston');

const logger = winston.createLogger({
  level: 'debug',
  transports: [
    new winston.transports.File({
      filename: 'logs/service.log', // 固定文件名
      maxsize: 10 * 1024 * 1024,   // 10 MB
      maxFiles: 1,                 // 只保留1个文件
      rotationFormat: () => ''     // 轮转后不更改文件名,实现覆盖
    }),
    new winston.transports.Console({ level: 'info' })
  ],
  exitOnError: false
});
/path/to/nodejs/logs/*.log {
    daily
    rotate 7
    compress
    missingok
    notifempty
    create 0644 root root
}
{
  "apps": [{
    "name": "my-api",
    "script": "src/index.js",
    "out_file": "./logs/out.log",
    "error_file": "./logs/err.log",
    "max_size": "20M",
    "max_files": "14"
  }]
}
docker run -d \
  --name my_app \
  --log-driver local \
  --log-opt max-size=10m \
  --log-opt max-file=3 \
  my_image

上述示例覆盖了应用内(Winston/Pino/Log4js)、系统级(logrotate)、进程管理(PM2)与容器(Docker)的主流做法。

四 选型与最佳实践

0
看了该问题的人还看了