在Node.js應用程序中,日志輪轉是一種重要的策略,用于管理日志文件的大小和數量,以防止磁盤空間不足。以下是配置Node.js日志輪轉的最佳實踐:
winston
或pino
等日志庫winston
和pino
是Node.js中流行的日志庫,它們都支持日志輪轉。
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 transport = new transports.DailyRotateFile({
filename: 'application-%DATE%.log',
datePattern: 'YYYY-MM-DD-HH',
zippedArchive: true,
maxSize: '20m',
maxFiles: '14d'
});
logger.add(transport);
pino
const pino = require('pino');
const { createLogger } = pino;
const { prettyPrint } = require('pino-pretty');
const logger = createLogger({
level: 'info',
transport: {
target: 'pino-pretty',
options: {
colorize: true,
translateTime: 'SYS:standard'
}
}
});
// 日志輪轉配置
const fs = require('fs');
const path = require('path');
const { createWriteStream, format } = require('pino');
const { combine, timestamp } = format;
const logStream = createWriteStream(path.join(__dirname, 'logs', 'application.log'), { flags: 'a' });
const logger = createLogger({
level: 'info',
transport: {
target: logStream,
formatter: combine(
timestamp(),
format.json()
)
}
});
// 使用`pino-rotate`進行日志輪轉
const pinoRotate = require('pino-rotate');
pinoRotate({
period: '1d',
path: path.join(__dirname, 'logs', 'application.log'),
size: '20m',
compress: true,
rotate: 14
});
maxSize
: 設置單個日志文件的最大大小。maxFiles
: 設置保留的日志文件數量。zippedArchive
: 是否壓縮舊的日志文件。compress
: 是否壓縮舊的日志文件(與zippedArchive
類似)。period
: 設置日志文件的輪轉周期,例如每天、每周等。datePattern
: 設置日期格式,用于生成輪轉后的日志文件名。通過以上配置,可以有效地管理Node.js應用程序的日志文件,確保系統的穩定性和可維護性。