在Node.js应用程序中,日志分割和归档是确保应用程序稳定运行和便于故障排查的重要环节。以下是一些常见的日志分割与归档策略:
使用成熟的日志库,如 winston
或 pino
,它们提供了丰富的功能来处理日志分割和归档。
Winston 是一个灵活的日志库,支持多种传输方式和格式,并且可以轻松地集成日志分割和归档。
const winston = require('winston');
const { createLogger, format, transports } = winston;
const { combine, timestamp, printf } = format;
const myFormat = printf(({ level, message, timestamp }) => {
return `${timestamp} ${level}: ${message}`;
});
const logger = createLogger({
format: combine(
timestamp(),
myFormat
),
transports: [
new transports.File({ filename: 'error.log', level: 'error' }),
new transports.File({ filename: 'combined.log' })
]
});
// 日志分割和归档
const dailyRotateFileTransport = new transports.DailyRotateFile({
filename: 'application-%DATE%.log',
datePattern: 'YYYY-MM-DD-HH',
zippedArchive: true,
maxSize: '20m',
maxFiles: '14d'
});
logger.add(dailyRotateFileTransport);
Pino 是一个高性能的日志库,支持流式传输和日志分割。
const pino = require('pino');
const { prettyPrint } = require('pino-pretty');
const logger = pino({
level: 'info',
transport: {
target: 'pino-pretty',
options: {
colorize: true,
translateTime: 'SYS:standard'
}
}
});
// 日志分割和归档
const { createLogger } = require('pino-rotate');
const loggerWithRotate = createLogger({
level: 'info',
transport: {
target: 'pino-pretty',
options: {
colorize: true,
translateTime: 'SYS:standard'
}
},
interval: '1d',
path: 'application.log',
maxsize: '20m',
gzip: true,
retainDays: 14
});
可以使用系统工具如 logrotate
来管理日志文件的分割和归档。
创建一个 logrotate
配置文件 /etc/logrotate.d/myapp
:
/path/to/your/application.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
create 640 root adm
}
这个配置会每天分割日志文件,并保留最近14天的日志文件,压缩旧的日志文件。
如果需要更复杂的日志分割逻辑,可以编写自定义的日志分割函数。
const fs = require('fs');
const path = require('path');
const moment = require('moment');
const logDirectory = '/path/to/logs';
const logFileName = 'application.log';
function rotateLogs() {
const now = moment();
const logFile = path.join(logDirectory, logFileName);
const rotatedLogFile = path.join(logDirectory, `application-${now.format('YYYY-MM-DD')}.log`);
if (fs.existsSync(logFile)) {
fs.renameSync(logFile, rotatedLogFile);
}
// 创建新的日志文件
const newLogFile = fs.createWriteStream(logFile, { flags: 'a' });
newLogFile.write(`Log rotated at ${now.format('YYYY-MM-DD HH:mm:ss')}\n`);
}
// 定期调用 rotateLogs 函数
setInterval(rotateLogs, 86400000); // 每天执行一次
选择合适的日志库和工具,结合自定义逻辑,可以有效地实现Node.js应用程序的日志分割与归档。确保日志文件不会无限增长,同时保留足够的历史数据以便故障排查。
辰迅云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
推荐阅读: linux离线安装openssl怎么实现