0Pricing
JavaScript Academy · 课时

E2——日志分析器(简单筛选与计数器)

解析内存中的日志行数组,按级别或关键词筛选,并使用 Map 统计事件。保持代码小巧易读

E2——日志分析器(简单筛选与计数器) 是 CoddyKit 上的免费 JavaScript Academy 课时。 这是第 2 节课,共 3 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 JavaScript Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 JavaScript Academy 课程共包含 3 节课。

我们要构建的内容

目标:在内存中分析日志。

  • 将各行表示为简短字符串
  • 按level或关键词过滤
  • 使用Map计数
  • 让函数保持简短清晰
E2——日志分析器(简单筛选与计数器) — 插图 1

数据与解析器

为每一行创建一个简单结构:time、level 和文本。这已经足够用于过滤和计数。

// Simulated log lines (time level message)
const LINES = [
  "10:00 INFO  Start app",
  "10:01 WARN  Low memory",
  "10:02 INFO  User login /home",
  "10:03 ERROR DB timeout",
  "10:04 INFO  User login /products",
  "10:05 ERROR Network fail",
  "10:06 WARN  Retry request"
];

// Tiny parser: returns { time, level, text }
function parseLine(line) {
  // split on spaces, compact, then rebuild pieces
  const parts = line.trim().split(/\\s+/);
  if (parts.length < 3) return null;
  const time = parts[0];
  const level = parts[1];
  const text = parts.slice(2).join(" ");
  return { time: time, level: level, text: text };
}

console.log("parsed:", parseLine(LINES[2]));
E2——日志分析器(简单筛选与计数器) — 插图 2

过滤基础

针对每个常见问题编写小型过滤函数。简短易读胜过炫技。

// Filter by level or by keyword (case-sensitive for simplicity)
function filterByLevel(lines, want) {
  const out = [];
  for (const line of lines) {
    const p = parseLine(line);
    if (p && p.level === want) out.push(p);
  }
  return out;
}

function filterByKeyword(lines, word) {
  const out = [];
  for (const line of lines) {
    const p = parseLine(line);
    if (p && p.text.indexOf(word) !== -1) out.push(p);
  }
  return out;
}

console.log("ERRORs:", filterByLevel(LINES, "ERROR").length);
console.log("login :", filterByKeyword(LINES, "login").length);
E2——日志分析器(简单筛选与计数器) — 插图 3

使用 Map 计数

使用Map进行计数:更新速度快,而且可以方便地读取每个键的结果。

// Count how many lines per level
function countByLevel(lines) {
  const counts = new Map();
  for (const line of lines) {
    const p = parseLine(line);
    if (!p) continue;
    const old = counts.get(p.level) || 0;
    counts.set(p.level, old + 1);
  }
  return counts;
}

const c = countByLevel(LINES);
console.log("INFO :", c.get("INFO"));
console.log("WARN :", c.get("WARN"));
console.log("ERROR:", c.get("ERROR"));
E2——日志分析器(简单筛选与计数器) — 插图 4

前 N 项示例

进行少量字符串提取,再使用计数 Map 排名。让解析规则保持简单。

// Extract a path after "User login " and rank by frequency
function topLoginPaths(lines, k) {
  const freq = new Map();
  for (const line of lines) {
    const p = parseLine(line);
    if (!p) continue;
    const mark = "User login ";
    const idx = p.text.indexOf(mark);
    if (idx !== -1) {
      const path = p.text.slice(idx + mark.length).trim();
      const old = freq.get(path) || 0;
      freq.set(path, old + 1);
    }
  }
  // turn into array and sort descending by count
  const arr = Array.from(freq.entries());
  arr.sort(function (a, b) { return b[1] - a[1]; });
  return arr.slice(0, k);
}

console.log("top paths:", topLoginPaths(LINES, 3));
E2——日志分析器(简单筛选与计数器) — 插图 5

初学者指南

提示:

  • 先编写一个小型解析器。
  • 针对每个问题编写小型过滤辅助函数。
  • 使用Map计数。
  • 对于初学者,优先使用简单字符串和清晰的循环。
E2——日志分析器(简单筛选与计数器) — 插图 6

使用 Map 计数测验

快速检查:计数结构。

E2——日志分析器(简单筛选与计数器) — 插图 7

总结

总结:将数据解析为简单结构,按 level/关键词过滤,并使用Map计数。让每个辅助函数都简短明确。

E2——日志分析器(简单筛选与计数器) — 插图 8

常见问题解答

「E2——日志分析器(简单筛选与计数器)」课时是免费的吗?

是的 — 「E2——日志分析器(简单筛选与计数器)」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 JavaScript Academy 课程的其余内容,请升级到 CoddyKit PRO。 JavaScript Academy 课程共包含 3 节课。

「E2——日志分析器(简单筛选与计数器)」这节课中我会学到什么?

解析内存中的日志行数组,按级别或关键词筛选,并使用 Map 统计事件。保持代码小巧易读 你通过在浏览器中直接运行的动手代码来练习 JavaScript Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 JavaScript Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 JavaScript Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 3 节。

「E2——日志分析器(简单筛选与计数器)」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 JavaScript Academy 课中编写并运行代码吗?

能。每节 JavaScript Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. E1——表达式求值器(第 1 部分:+ 和 -,从左到右)
  2. E2——日志分析器(简单筛选与计数器)
  3. E3——Promise 池/队列(异步并发)
← 返回 JavaScript Academy