File size: 1,832 Bytes
b88ce1b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
import fs from 'fs/promises';
import path from 'path';

const LOGS_FILE = path.join(process.cwd(), 'data', 'app_logs.json');
const MAX_LOGS = 200; // 最多保存 200 条日志(降低内存使用)

// 内存缓存,避免频繁读取文件
let logsCache = null;
let lastCacheTime = 0;
const CACHE_DURATION = 30000; // 缓存30秒

// 确保数据目录存在
async function ensureDataDir() {
  const dataDir = path.dirname(LOGS_FILE);
  try {
    await fs.access(dataDir);
  } catch {
    await fs.mkdir(dataDir, { recursive: true });
  }
}

// 加载日志(带缓存)
export async function loadLogs() {
  const now = Date.now();

  // 如果缓存有效,直接返回缓存
  if (logsCache && (now - lastCacheTime) < CACHE_DURATION) {
    return logsCache;
  }

  await ensureDataDir();
  try {
    const data = await fs.readFile(LOGS_FILE, 'utf-8');
    logsCache = JSON.parse(data);
    lastCacheTime = now;
    return logsCache;
  } catch (error) {
    if (error.code === 'ENOENT') {
      logsCache = [];
      lastCacheTime = now;
      return [];
    }
    throw error;
  }
}

// 保存日志
async function saveLogs(logs) {
  await ensureDataDir();
  // 只保留最新的日志
  const recentLogs = logs.slice(-MAX_LOGS);
  await fs.writeFile(LOGS_FILE, JSON.stringify(recentLogs, null, 2), 'utf-8');

  // 更新缓存
  logsCache = recentLogs;
  lastCacheTime = Date.now();
}

// 添加日志
export async function addLog(level, message) {
  const logs = await loadLogs();
  logs.push({
    timestamp: new Date().toISOString(),
    level,
    message
  });
  await saveLogs(logs);
}

// 清空日志
export async function clearLogs() {
  await saveLogs([]);
}

// 获取最近的日志
export async function getRecentLogs(limit = 100) {
  const logs = await loadLogs();
  return logs.slice(-limit).reverse();
}