ubuntu

Node.js日志如何归档

小樊
46
2025-10-01 03:59:20
栏目: 编程语言

在Node.js中,可以使用第三方库或者自带的模块来实现日志归档。以下是两种常见的方法:

方法一:使用winston

winston是一个流行的Node.js日志库,可以轻松地实现日志归档。首先,需要安装winston

npm install winston

接下来,创建一个logger.js文件,并设置日志归档:

const winston = require('winston');
const { combine, timestamp, printf } = winston.format;

// 自定义日志格式
const myFormat = printf(({ level, message, timestamp }) => {
  return `${timestamp} ${level.toUpperCase()}: ${message}`;
});

// 创建一个logger实例
const logger = winston.createLogger({
  level: 'info',
  format: combine(timestamp(), myFormat),
  transports: [
    new winston.transports.File({ filename: 'logs/error.log', level: 'error' }),
    new winston.transports.File({ filename: 'logs/combined.log' }),
  ],
});

// 日志归档
const archive = new winston.transports.DailyRotateFile({
  filename: 'logs/logs-%DATE%.log',
  datePattern: 'YYYY-MM-DD',
  zippedArchive: true,
  maxSize: '20m',
  maxFiles: '14d',
});

logger.add(archive);

module.exports = logger;

在需要记录日志的地方,引入logger.js

const logger = require('./logger');

logger.info('Hello, world!');

方法二:使用Node.js内置的fs模块

如果不想使用第三方库,可以使用Node.js内置的fs模块来实现日志归档。以下是一个简单的示例:

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

const logDir = path.join(__dirname, 'logs');
const archiveDir = path.join(logDir, 'archive');

if (!fs.existsSync(logDir)) {
  fs.mkdirSync(logDir);
}

if (!fs.existsSync(archiveDir)) {
  fs.mkdirSync(archiveDir);
}

const logFile = path.join(logDir, 'app.log');
const archiveLogFile = path.join(archiveDir, `app-${moment().format('YYYY-MM-DD')}.log`);

function logToFile(message) {
  const timestamp = moment().format('YYYY-MM-DD HH:mm:ss');
  const logEntry = `${timestamp}: ${message}\n`;

  fs.appendFile(logFile, logEntry, (err) => {
    if (err) console.error('Error writing to log file:', err);
  });

  // 每天归档日志文件
  if (moment().format('YYYY-MM-DD') !== moment().subtract(1, 'days').format('YYYY-MM-DD')) {
    fs.rename(logFile, archiveLogFile, (err) => {
      if (err) console.error('Error archiving log file:', err);
    });
  }
}

logToFile('Hello, world!');

在这个示例中,我们使用fs.appendFile()将日志写入文件,并使用fs.rename()将旧日志文件移动到归档目录。这个简单的实现可以根据需要进行扩展和优化。

0
看了该问题的人还看了