asp 语言 ASP 与 Grafana Loki 集成实现日志查询

ASP阿木 发布于 2025-06-17 5 次阅读


ASP 与 Grafana Loki 集成实现日志查询

随着互联网技术的飞速发展,日志记录已成为现代软件开发和运维中不可或缺的一部分。ASP.NET 作为一种流行的 Web 开发框架,能够生成动态的 Web 应用程序。而 Grafana Loki 是一个开源的日志聚合系统,可以有效地收集、存储和查询日志数据。本文将探讨如何将 ASP.NET 应用与 Grafana Loki 集成,实现高效的日志查询。

环境准备

在开始之前,我们需要准备以下环境:

1. ASP.NET Core 开发环境

2. Grafana Loki 安装包

3. Docker(可选,用于容器化部署)

步骤一:创建 ASP.NET Core 应用

我们需要创建一个 ASP.NET Core Web API 应用。以下是创建应用的步骤:

1. 打开 Visual Studio 或其他 IDE,创建一个新的 ASP.NET Core Web API 项目。

2. 选择项目模板,例如“ASP.NET Core Web API”。

3. 设置项目名称和保存位置。

步骤二:添加日志记录服务

在 ASP.NET Core 应用中,我们可以使用 `Microsoft.Extensions.Logging` 命名空间提供的日志记录服务。以下是添加日志记录服务的步骤:

1. 在 `Startup.cs` 文件中,添加以下代码:

csharp

public class Startup


{


public void ConfigureServices(IServiceCollection services)


{


// 添加日志记录服务


services.AddLogging(loggingBuilder =>


{


loggingBuilder.ClearProviders();


loggingBuilder.SetMinimumLevel(LogLevel.Trace);


loggingBuilder.AddConsole();


loggingBuilder.AddDebug();


// 添加 Loki 日志记录服务


loggingBuilder.AddLoki(options =>


{


options.Uri = new Uri("http://localhost:3100/loki/api/v1/push");


options.MaxBatchSize = 10;


options.MaxRetries = 3;


options.MaxRetryWaitDuration = TimeSpan.FromSeconds(5);


});


});


}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)


{


if (env.IsDevelopment())


{


app.UseDeveloperExceptionPage();


}

app.UseRouting();

app.UseEndpoints(endpoints =>


{


endpoints.MapControllers();


});


}


}


2. 在 `appsettings.json` 文件中,添加以下配置:

json

{


"Logging": {


"LogLevel": {


"Default": "Trace"


}


}


}


步骤三:配置 Grafana Loki

1. 下载并解压 Grafana Loki 安装包。

2. 启动 Grafana Loki 服务:

bash

./loki -config.file ./loki.yml


3. 在 `loki.yml` 文件中,配置 Loki 的存储和索引:

```yaml

http:

listen: 0.0.0.0:3100

storage:

boltdb:

path: /var/log/loki/boltdb

ingester:

ring:

kvstore: /var/log/loki/ring/kvstore.db

ring: /var/log/loki/ring/ring.db

http-listen: 0.0.0.0:3101

http-listen-timeout: 10s

http-max-connections: 1000

http-idle-timeout: 60s

http-keepalive: true

http-keepalive-timeout: 60s

http-keepalive-max-requests: 100

http-keepalive-max-requests-timeout: 60s

http-keepalive-max-requests-timeout-timeout: 60s

http-keepalive-max-requests-timeout-timeout-timeout: 60s

http-keepalive-max-requests-timeout-timeout-timeout-timeout: 60s

http-keepalive-max-requests-timeout-timeout-timeout-timeout-timeout: 60s

http-keepalive-max-requests-timeout-timeout-timeout-timeout-timeout-timeout: 60s

http-keepalive-max-requests-timeout-timeout-timeout-timeout-timeout-timeout-timeout: 60s

http-keepalive-max-requests-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout: 60s

http-keepalive-max-requests-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout: 60s

http-keepalive-max-requests-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout: 60s

http-keepalive-max-requests-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout: 60s

http-keepalive-max-requests-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout: 60s

http-keepalive-max-requests-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout: 60s

http-keepalive-max-requests-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout: 60s

http-keepalive-max-requests-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout: 60s

http-keepalive-max-requests-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout: 60s

http-keepalive-max-requests-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout: 60s

http-keepalive-max-requests-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout: 60s

http-keepalive-max-requests-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout: 60s

http-keepalive-max-requests-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout: 60s

http-keepalive-max-requests-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout: 60s

http-keepalive-max-requests-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout: 60s

http-keepalive-max-requests-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout: 60s

http-keepalive-max-requests-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout: 60s

http-keepalive-max-requests-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout: 60s

http-keepalive-max-requests-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout: 60s

http-keepalive-max-requests-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout: 60s

http-keepalive-max-requests-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout: 60s

http-keepalive-max-requests-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout: 60s

http-keepalive-max-requests-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout: 60s

http-keepalive-max-requests-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout: 60s

http-keepalive-max-requests-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout: 60s

http-keepalive-max-requests-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout: 60s

http-keepalive-max-requests-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout: 60s

http-keepalive-max-requests-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout: 60s

http-keepalive-max-requests-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout: 60s

http-keepalive-max-requests-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout: 60s

http-keepalive-max-requests-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout: 60s

http-keepalive-max-requests-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout: 60s

http-keepalive-max-requests-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout: 60s

http-keepalive-max-requests-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout: 60s

http-keepalive-max-requests-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout: 60s

http-keepalive-max-requests-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout: 60s

http-keepalive-max-requests-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout: 60s

http-keepalive-max-requests-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout: 60s

http-keepalive-max-requests-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout: 60s

http-keepalive-max-requests-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout: 60s

http-keepalive-max-requests-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout: 60s

http-keepalive-max-requests-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout: 60s

http-keepalive-max-requests-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout: 60s

http-keepalive-max-requests-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout: 60s

http-keepalive-max-requests-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout: 60s

http-keepalive-max-requests-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout: 60s

http-keepalive-max-requests-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout: 60s

http-keepalive-max-requests-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout: 60s

http-keepalive-max-requests-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout: 60s

http-keepalive-max-requests-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout: 60s

http-keepalive-max-requests-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout: 60s

http-keepalive-max-requests-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout: 60s

http-keepalive-max-requests-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout: 60s

http-keepalive-max-requests-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout-timeout