CodeGym /课程 /C# SELF /日志收集: Seq

日志收集: SeqApplication Insights

C# SELF
第 64 级 , 课程 2
可用

1. 介绍

在深入实践之前,先弄清楚为啥需要外部日志收集系统。想象你的应用部署在生产环境,不是在个人电脑上:数百台服务器、微服务、很多用户,有人抱怨 “应用卡顿”。在这种日志流里找到需要的事件就像在草垛里找针。没有集中式日志收集,调试和维护这样的应用几乎不可能。这时候 SeqApplication 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。

  1. 下载并安装 Seq。
  2. 安装后打开 Web 界面(通常是 http://localhost:5341)。
  3. 搞定!现在只需配置应用把日志发送到 Seq。

SerilogSeq 集成

安装 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. 对比 SeqApplication Insights

Seq Application Insights
存储位置 本地服务器(或云) Azure 云
费用 本地可免费/付费 有免费层,超出后按 Azure 收费
最佳使用场景 .NET 应用、本地 CI 任意应用,生产/企业级
UI / 搜索 非常友好,支持丰富过滤 功能强大,支持分析和仪表盘
告警能力 内置 复杂条件,可与 Azure 集成
集成 Serilog,其他 sinks ASP.NET, .NET, JS 等提供 SDK
灵活性 由你自己掌控 受 Microsoft 服务规范约束

把这些知识用到实践中

掌握 SeqApplication Insights 不仅在生产环境有用,在开发和测试阶段(比如分析自动化测试行为)也很有帮助。处理微服务时你会想看全局日志视图。面试时常被问到 “你会怎样组织日志收集以便在生产中快速定位问题?” —— 现在你有答案了!

很多公司把这些系统构造成完整的 DevOps 流水线:Continuous Delivery、基于告警自动创建 bug 等。日志收集系统不是简单的 “Console.WriteLine 去哪里了”,而是真正的“黑匣子”和应用的监控中心。

评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION