温馨提示×

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