1. 介绍
在深入实践之前,先弄清楚为啥需要外部日志收集系统。想象你的应用部署在生产环境,不是在个人电脑上:数百台服务器、微服务、很多用户,有人抱怨 “应用卡顿”。在这种日志流里找到需要的事件就像在草垛里找针。没有集中式日志收集,调试和维护这样的应用几乎不可能。这时候 Seq 和 Application Insights 就派上用场了。
Seq:好用的 UI、快速搜索、实时
Seq 是一个面向 .NET 和 Serilog 的结构化日志集中收集与分析系统。这不仅仅是简单的把日志文件上传,而是一个强大的工具:你可以实时看到日志流、按属性过滤和搜索、构建告警。Seq 可以本地部署也可以云端运行。
为什么选 Seq?
- 为 .NET 和 Serilog 优化,开箱即用。
- 极快的搜索和按任意消息属性过滤。
- 简洁好用的 Web 界面。
- 可以本地部署,不需要复杂流程,甚至能在笔记本上跑。
简单的架构是什么样?
+--------------+ +-------------+ +-------------+
| .NET 应用 | --(日志)| Serilog | --(http)| Seq |
+--------------+ +-------------+ +-------------+
| ^
| |
(搜索、过滤、告警、 <----[Web UI]
集成)
应用通过 Serilog 写结构化日志,Serilog 把它们发到 Seq。在 Seq 的网页界面你可以随心所欲地操作。
2. 把 Serilog 接入 Seq
安装 Seq
Seq 可以在本地快速试用,方便做实验。比如在 Windows 上可以从 官方下载页面 下载 Seq。
- 下载并安装 Seq。
- 安装后打开 Web 界面(通常是 http://localhost:5341)。
- 搞定!现在只需配置应用把日志发送到 Seq。
将 Serilog 与 Seq 集成
安装 NuGet 包:
dotnet add package Serilog.Sinks.Seq
在 Program.cs 中的示例配置:
using Serilog;
public class Program
{
public static void Main(string[] args)
{
// 为 Serilog 配置,把日志输出到 Seq
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Information()
.WriteTo.Console()
.WriteTo.Seq("http://localhost:5341") // 你的 Seq 服务器的 URL
.CreateLogger();
Log.Information("应用启动");
// ... 其余应用代码 ...
Log.CloseAndFlush();
}
}
如果一切配置正确,你的应用日志就会开始发往 Seq。
结构化事件示例
Log.Information("用户 {User} 登录于 {Time}", userName, DateTime.UtcNow);
在 Seq 里你现在可以搜索某个用户的所有登录:
User == 'vasya'
过滤和搜索
Seq 能按任意字段和值过滤事件。比如想看今天所有的错误?只需要写过滤器:
@Level = 'Error' and @Timestamp > today()
可以组合多个条件 — 真方便!
告警和集成
Seq 支持设置告警:例如错误数超过阈值时,会发邮件、触发 webhook,或者把消息发到 Slack。
还有哪些功能?
- 和 CI/CD 系统集成,自动收集测试日志。
- 支持自定义 Dashboards(部分高级功能可能付费)。
- 分析日志的插件、自动化操作(比如失败时自动创建 bug)。
- 通过插件与 Grafana/Prometheus 集成。
配置 Seq 常见错误
常见问题之一是没有正确写 Serilog 里的 Seq URL,或者 Seq 服务器监听的端口不对。
另一个常见问题是在 Docker 或服务器上运行 Seq 时没有开放入站端口。要检查应用能否访问 Seq 的端口。
3. Application Insights:针对 .NET 的遥测,云端服务
Application Insights(通常简称 "App Insights")是 Microsoft Azure 上的应用监控与分析平台。不只是收日志,还能自动发现异常、分析使用情况、监控依赖、请求、外部 API 调用,并实时可视化。Azure 的 Application Insights 在企业级 .NET 场景里非常常见。
Application Insights 的优点是什么?
- 不需要单独装服务器:一切在云端。
- 与 .NET、ASP.NET、Azure、Visual Studio 深度集成。
- 自动收集不仅是你的日志,还有度量、异常、请求、SQL 查询等。
- 可构建仪表盘、监控 SLA、查找异常、分析分布式追踪(distributed tracing)。
Application Insights 如何工作?
+--------------+ +-------------------+ +---------------------+
| .NET 应用 | --(SDK)| AppInsights SDK | --(https)| Azure Application |
+--------------+ +-------------------+ | Insights (云端) |
+---------------------+
^ |
(W3C Trace +----> 分析、搜索、仪表盘
Context)
接入 SDK 的应用把遥测数据发送到 Azure 云端,你在 Azure 门户里做分析和可视化。
把 Application Insights 集成到 .NET 应用
方式1:快速上手
如果你有一个 ASP.NET Core 应用,接入非常简单:
dotnet add package Microsoft.ApplicationInsights.AspNetCore
在 Program.cs 中:
builder.Services.AddApplicationInsightsTelemetry("<你的_InstrumentationKey>");
如果是控制台或桌面应用:
dotnet add package Microsoft.ApplicationInsights
初始化示例:
using Microsoft.ApplicationInsights;
using Microsoft.ApplicationInsights.Extensibility;
var telemetryConfig = TelemetryConfiguration.CreateDefault();
telemetryConfig.InstrumentationKey = "<你的_InstrumentationKey>";
var telemetryClient = new TelemetryClient(telemetryConfig);
telemetryClient.TrackTrace("Hello from Application Insights!");
telemetryClient.TrackException(new Exception("哎呀,发生错误了!"));
Instrumentation Key(仪表键)需要在 Azure 门户中创建 Application Insights 资源后获取。
如何发送结构化数据?
你可以给每条 trace 添加属性:
telemetryClient.TrackTrace("用户已登录",
new Dictionary<string, string> { ["User"] = userName }
);
示例:记录用户操作
假设你想记录用户登录:
var props = new Dictionary<string, string>
{
{ "User", userName },
{ "Time", DateTime.UtcNow.ToString("o") }
};
telemetryClient.TrackEvent("UserLogin", props);
现在事件和所有属性都会在门户里可见。
4. 有用的小技巧
在 Application Insights 里你能看到什么?
- 应用概览:入口、错误、依赖(例如 SQL 查询)。
- 日志搜索:任意事件,按属性过滤。
- 可视化:图表、仪表盘。
- Tracing:可以看到调用链以及每个操作耗时。
- 告警:按任意条件配置告警。
简要说明 Application Insights 的数据结构
| 对象 | 说明 |
|---|---|
| Trace | 字符串消息(普通日志)。 |
| Event | 任意事件(例如 “Purchase”)。 |
| Exception | 错误/异常信息。 |
| Dependency | 外部调用(SQL、HTTP 请求等)。 |
| Metric | 数值指标(例如计数)。 |
| Request | 用户请求(针对 Web 应用)。 |
示例:在 Application Insights 中搜索错误
在 Azure 门户可以写一个简单的查询(Kusto Query Language — KQL):
exceptions
| where timestamp > ago(1d)
| where outerMessage contains "Timeout"
| project timestamp, operation_Name, user_Id, outerMessage
这会列出过去一天内所有包含 “Timeout” 的超时异常,并显示详细信息。
Application Insights 的限制/注意点
- 需要 Azure 账号才能使用。可以有免费额度,但有配额限制。
- 有时候日志从发送到在 UI 中可见会有几分钟延迟。
- 对于“非常私密”的项目,它是云服务,不是本地部署。
- 如果滥用 trace,会很快耗尽日配额。
5. 对比 Seq 和 Application Insights
| Seq | Application Insights | |
|---|---|---|
| 存储位置 | 本地服务器(或云) | Azure 云 |
| 费用 | 本地可免费/付费 | 有免费层,超出后按 Azure 收费 |
| 最佳使用场景 | .NET 应用、本地 CI | 任意应用,生产/企业级 |
| UI / 搜索 | 非常友好,支持丰富过滤 | 功能强大,支持分析和仪表盘 |
| 告警能力 | 内置 | 复杂条件,可与 Azure 集成 |
| 集成 | Serilog,其他 sinks | 为 ASP.NET, .NET, JS 等提供 SDK |
| 灵活性 | 由你自己掌控 | 受 Microsoft 服务规范约束 |
把这些知识用到实践中
掌握 Seq 和 Application Insights 不仅在生产环境有用,在开发和测试阶段(比如分析自动化测试行为)也很有帮助。处理微服务时你会想看全局日志视图。面试时常被问到 “你会怎样组织日志收集以便在生产中快速定位问题?” —— 现在你有答案了!
很多公司把这些系统构造成完整的 DevOps 流水线:Continuous Delivery、基于告警自动创建 bug 等。日志收集系统不是简单的 “Console.WriteLine 去哪里了”,而是真正的“黑匣子”和应用的监控中心。
GO TO FULL VERSION