101 lines
3.1 KiB
JavaScript
Raw Permalink Normal View History

2026-07-27 11:28:33 +08:00
const winston = require("winston");
const path = require("path");
const fs = require("fs");
const DailyRotateFile = require("winston-daily-rotate-file");
const appRoot = require("app-root-path").path;
// 清理15天前的日志文件夹
function cleanOldLogs() {
const logsBaseDir = path.join(appRoot, "logs");
// 确保日志基础目录存在
if (!fs.existsSync(logsBaseDir)) return;
// 获取15天前的日期
const fifteenDaysAgo = new Date();
fifteenDaysAgo.setDate(fifteenDaysAgo.getDate() - 15);
const cutoffDate = fifteenDaysAgo.toISOString().split("T")[0]; // 格式YYYY-MM-DD
try {
// 读取logs目录下的所有文件夹
const logDirs = fs.readdirSync(logsBaseDir);
// 遍历所有日志文件夹
logDirs.forEach((dir) => {
// 检查文件夹名是否是有效日期格式
if (/^\d{4}-\d{2}-\d{2}$/.test(dir)) {
// 如果文件夹日期早于截止日期,则删除
if (dir < cutoffDate) {
const dirPath = path.join(logsBaseDir, dir);
fs.rmSync(dirPath, { recursive: true, force: true });
console.log(`已删除旧日志文件夹: ${dir}`);
}
}
});
} catch (err) {
console.error("清理旧日志文件失败:", err);
}
}
// 执行清理
cleanOldLogs();
// 创建一个日志记录器
const logger = winston.createLogger({
level: "info", // 默认日志级别
format: winston.format.combine(
winston.format.timestamp({
format: () => new Date().toLocaleString(), // 使用本地时间
}),
winston.format.printf(({ timestamp, level, message }) => {
return `${timestamp} ${level}: ${message}`;
})
),
transports: [
// 输出到控制台
new winston.transports.Console({
format: winston.format.combine(
winston.format.colorize(), // 控制台输出带颜色
winston.format.simple() // 简单的日志输出格式
),
}),
// 输出到按日期分目录的文件
new DailyRotateFile({
filename: path.join(appRoot, "logs", "%DATE%", "app-%DATE%.log"),
datePattern: "YYYY-MM-DD", // 文件名中的日期格式
maxSize: "20m", // 限制单个日志文件大小为20MB
maxFiles: "30d", // 保留3天的日志文件
}),
],
});
function info(item, item1 = "") {
let title = typeof item === "object" ? JSON.stringify(item) : item;
let title2 = typeof item1 === "object" ? JSON.stringify(item1) : item1;
const title3 = title2 ? `${title},${title2}` : title;
logger.info(title3);
}
function error(item, item1 = "") {
let title = typeof item === "object" ? JSON.stringify(item) : item;
let title2 = typeof item1 === "object" ? JSON.stringify(item1) : item1;
const title3 = title2 ? `${title},${title2}` : title;
logger.error(title3);
}
function warn(item, item1 = "") {
let title = typeof item === "object" ? JSON.stringify(item) : item;
let title2 = typeof item1 === "object" ? JSON.stringify(item1) : item1;
const title3 = title2 ? `${title},${title2}` : title;
logger.warn(title3);
}
// 设置定时任务,每天执行一次清理
setInterval(cleanOldLogs, 24 * 60 * 60 * 1000);
module.exports = {
info,
error,
warn,
};