在Node.js应用中,日志轮转和压缩是重要的维护任务,有助于管理日志文件的大小和数量,从而优化磁盘空间使用和提高系统性能。以下是一些实践方法:
使用winston库
winston是一个流行的Node.js日志库,支持日志轮转。你可以使用winston-daily-rotate-file传输来实现每日轮转。
const winston = require('winston');
const DailyRotateFile = require('winston-daily-rotate-file');
const transport = new DailyRotateFile({
filename: 'application-%DATE%.log',
datePattern: 'YYYY-MM-DD-HH',
zippedArchive: true,
maxSize: '20m',
maxFiles: '14d'
});
const logger = winston.createLogger({
level: 'info',
format: winston.format.json(),
transports: [
transport
]
});
logger.info('Hello, world!');
使用pino库
pino是另一个高性能的日志库,支持日志轮转。你可以使用pino-rotate库来实现日志轮转。
const pino = require('pino');
const rotate = require('pino-rotate');
const logger = pino({
level: 'info'
});
rotate({
period: '1d',
path: 'application.log',
size: '20m',
compress: true,
rotate: true
});
logger.info('Hello, world!');
使用zlib库
Node.js内置的zlib库可以用来压缩日志文件。你可以在日志轮转时自动压缩旧日志文件。
const fs = require('fs');
const zlib = require('zlib');
const path = require('path');
function compressFile(filePath) {
const gzip = zlib.createGzip();
const inputStream = fs.createReadStream(filePath);
const outputStream = fs.createWriteStream(filePath + '.gz');
inputStream.pipe(gzip).pipe(outputStream);
}
// 假设你已经有一个日志文件路径
const logFilePath = 'application.log';
compressFile(logFilePath);
使用archiver库
archiver是一个用于创建归档文件的Node.js库,支持多种压缩格式。
const fs = require('fs');
const archiver = require('archiver');
function compressFolder(folderPath, outputFilePath) {
const output = fs.createWriteStream(outputFilePath);
const archive = archiver('zip', {
zlib: { level: 9 } // 设置压缩级别
});
output.on('close', () => {
console.log(`${archive.pointer()} total bytes`);
console.log('archiver has been finalized and the output file descriptor has closed.');
});
archive.on('error', (err) => {
throw err;
});
archive.directory(folderPath, false);
archive.pipe(output);
archive.finalize();
}
// 假设你已经有一个日志文件夹路径
const logFolderPath = 'logs';
const outputZipPath = 'logs.zip';
compressFolder(logFolderPath, outputZipPath);
你可以使用cron作业或其他任务调度工具来自动化日志轮转和压缩任务。例如,在Linux系统上,你可以使用cron来每天运行一个脚本来处理日志文件。
# 编辑cron作业
crontab -e
# 添加以下行来每天午夜运行日志轮转和压缩脚本
0 0 * * * /usr/bin/node /path/to/your/log-rotate-script.js
在log-rotate-script.js中,你可以编写日志轮转和压缩的逻辑。
通过这些方法,你可以有效地管理Node.js应用的日志文件,确保它们不会占用过多的磁盘空间,并且可以轻松地进行归档和压缩。