github-actions[bot]
Update from GitHub Actions
dd27eb1
import fs from 'fs';
// 日志级别枚举
export const LogLevel = {
DEBUG: 'DEBUG',
INFO: 'INFO',
WARN: 'WARN',
ERROR: 'ERROR'
};
// 日志配置
const LOG_CONFIG = {
logFile: './logs/app.log',
logDir: './logs',
enableConsole: true,
enableFile: true,
logLevel: LogLevel.INFO
};
/**
* 确保日志目录存在
*/
function ensureLogDirectory() {
if (!fs.existsSync(LOG_CONFIG.logDir)) {
fs.mkdirSync(LOG_CONFIG.logDir, { recursive: true });
}
}
/**
* 格式化日志消息
* @param {...any} args - 要记录的参数
* @returns {string} 格式化后的消息
*/
function formatMessage(...args) {
return args.map(arg =>
typeof arg === 'object' ? JSON.stringify(arg) : String(arg)
).join(' ');
}
/**
* 写入日志到文件
* @param {string} level - 日志级别
* @param {string} message - 日志消息
*/
function writeToFile(level, message) {
if (!LOG_CONFIG.enableFile) return;
ensureLogDirectory();
const timestamp = new Date().toISOString();
const logEntry = `[${timestamp}] [${level}] ${message}\n`;
try {
fs.appendFileSync(LOG_CONFIG.logFile, logEntry);
} catch (error) {
// 避免循环调用,直接使用console
console.error('写入日志文件失败:', error);
}
}
/**
* 输出到控制台
* @param {string} level - 日志级别
* @param {...any} args - 要记录的参数
*/
function writeToConsole(level, ...args) {
if (!LOG_CONFIG.enableConsole) return;
switch (level) {
case LogLevel.DEBUG:
console.debug(...args);
break;
case LogLevel.INFO:
console.log(...args);
break;
case LogLevel.WARN:
console.warn(...args);
break;
case LogLevel.ERROR:
console.error(...args);
break;
default:
console.log(...args);
}
}
/**
* 通用日志记录函数
* @param {string} level - 日志级别
* @param {...any} args - 要记录的参数
*/
function writeLog(level, ...args) {
const message = formatMessage(...args);
// 输出到控制台
writeToConsole(level, ...args);
// 写入文件
writeToFile(level, message);
}
/**
* DEBUG级别日志
* @param {...any} args - 要记录的参数
*/
export function debug(...args) {
writeLog(LogLevel.DEBUG, ...args);
}
/**
* INFO级别日志(替代console.log)
* @param {...any} args - 要记录的参数
*/
export function info(...args) {
writeLog(LogLevel.INFO, ...args);
}
/**
* WARN级别日志(替代console.warn)
* @param {...any} args - 要记录的参数
*/
export function warn(...args) {
writeLog(LogLevel.WARN, ...args);
}
/**
* ERROR级别日志(替代console.error)
* @param {...any} args - 要记录的参数
*/
export function error(...args) {
writeLog(LogLevel.ERROR, ...args);
}
/**
* 读取最近的日志
* @param {number} lines - 要读取的行数,默认100行
* @returns {Array} 日志行数组
*/
export function getRecentLogs(lines = 100) {
try {
if (!fs.existsSync(LOG_CONFIG.logFile)) {
return [];
}
const content = fs.readFileSync(LOG_CONFIG.logFile, 'utf8');
const logLines = content.trim().split('\n').filter(line => line.length > 0);
// 返回最后 N 行
return logLines.slice(-lines);
} catch (err) {
console.error('读取日志文件失败:', err);
return [];
}
}
/**
* 清空日志文件
* @returns {boolean} 是否成功清空
*/
export function clearLogFile() {
try {
ensureLogDirectory();
fs.writeFileSync(LOG_CONFIG.logFile, '');
info('日志文件已清空');
return true;
} catch (err) {
error('清空日志文件失败:', err);
return false;
}
}
/**
* 配置日志设置
* @param {Object} config - 日志配置
*/
export function configureLogger(config = {}) {
Object.assign(LOG_CONFIG, config);
}
// 为了向后兼容,导出原有的函数名
export const log = info;
export const logError = error;
// 默认导出logger对象
export default {
debug,
info,
warn,
error,
log: info,
logError: error,
getRecentLogs,
clearLogFile,
configureLogger,
LogLevel
};