NebuLog — 面向 .NET 的实时日志

在十分之一秒内看到应用程序的日志出现在浏览器中,并按调用链(trace)跨服务关联。以演示访客身份进入,运行八个引导式场景中的任意一个。

打开在线演示 GitHub 源代码阅读它是如何建成的
.NET 10OpenTelemetrySignalRReact 19Docker
NebuLog — 面向 .NET 的实时日志 — 截图

它是什么

NebuLog 把应用程序的日志实时推送到浏览器控制台。应用程序照常使用标准的 .NET ILogger 写日志;NebuLog 在大约十分之一秒内显示每一条记录——可过滤、可搜索,并按调用链(trace)跨服务关联。

它起步于 2018 年,当时叫 MyLogger,是一个个人实验项目;2026 年 10 月基于 .NET 10、React 19 和 OpenTelemetry 标准重写为 v2。它以 Apache 2.0 许可开源,不是商业产品:放在这里,是因为这是展示我们如何做软件最直接的方式。

如何试用

  1. 打开 nebulog.imady.co.nz,选择 Continue as demo visitor(以演示访客身份继续)。无需账号,访客角色为只读。
  2. 选择八个引导式演示中的一个。每个演示会在一个窗口中打开一个小型商店应用,在另一个窗口中打开已预设过滤条件的控制台。
  3. 点击商店里的按钮。每个按钮恰好对应一次 HTTP 请求,并显示它的 TraceId,方便你在控制台中找到它。
  4. 点击 Checkout(结账),观察一个请求如何在同一条调用链下穿过两个服务。

有一个场景值得单独一提:同一个请求,一次由 Minimal API 处理,一次由 MVC 管道处理,前者产生 15 条框架日志,后者产生 55 条。你可以并排看到这个差别。

实时控制台,过滤到一个场景,显示同一条调用链下的两个服务

里面有什么

  • 两种接入方式。 通过 SignalR 使用 NebuLog 导出器,延迟最低并支持双向命令;或者从任何语言使用标准的 OTLP 导出器——这种情况下你的代码完全不依赖 NebuLog。
  • 建立在标准之上。 应用侧完全遵循 OpenTelemetry,因此同一个应用可以同时把日志发送到 NebuLog 和 .NET Aspire Dashboard。
  • 双向通信。 控制台可以向运行中的应用发送命令,应用也可以上报自定义的实时统计数据。
  • 默认安全。 人用 Cookie 会话,程序用 API 密钥,四种角色,密钥只以哈希形式存储,日志内容始终作为文本渲染,绝不作为 HTML。
  • 按生产标准部署。 容器以非 root 用户在只读文件系统上运行,镜像标签不可变,升级或回滚只需改一行。

NebuShop 演示应用,为引导式演示产生真实流量

实测,而非宣称

以下数据来自 2026 年 10 月 5 日的 v2.0 评估;方法与数据来源见公开代码仓库。

持续写入 连续五秒每秒 10,077 条,零拒收
从生产端到浏览器的延迟 p50 109 毫秒,p95 115 毫秒
浏览器控制台缓存 100,000 条时 滚动流畅,页面中约 51 行
自动化测试 324 项(.NET 246 项,前端 78 项)

为什么放在这个网站上

工具本身不如它的交付方式重要。v1 作为基线,所以从第一天起每一项需求都是具体的;工作由分工明确、带有书面验收标准的 AI 代理执行,彼此检查对方的产出;v2.0 在分析开始两天后就上线了。同样的方法,也适用于升级一家企业已经依赖的软件。

你也有一套需要这样升级的现有系统?

这里用的方法——以今天正在运行的系统为基线,决定保留什么,按可验证的步骤交付——同样适用于你的软件。

和我们聊聊