ASP .NET Core 集成 Loki 記錄日誌

簡介

Grafana Loki 是一個水平可擴展,高可用性,多租戶的日誌聚合系統,由Grafana團隊設計和開發,基於Apatch 2.0開源。其有三部分組成:

  • Loki 是主服務器,負責存儲日誌和處理查詢。對標ELK中的ElasticSearch。
  • Promtail 是代理,負責收集日誌並將其發送給loki。對標ELK中的Logstash。本文中目前沒有用到此工具
  • Grafana提供用戶界面。對標ELK中的Kibana。

相關地址:

部署

#新建配置目錄
mkdir  -p /dockerdata/loki

#下載配置文件(根據最新版本)
wget https://raw.githubusercontent.com/grafana/loki/v2.6.1/cmd/loki/loki-local-config.yaml -O /dockerdata/loki/loki-config.yaml

wget https://raw.githubusercontent.com/grafana/loki/v2.6.1/clients/cmd/promtail/promtail-docker-config.yaml  -O /dockerdata/loki/promtail-config.yaml

#Run Loki
docker run --name loki -d -p 3100:3100 -v /dockerdata/loki:/mnt/config   grafana/loki  -config.file=/mnt/config/loki-config.yaml

#修改promtail配置文件Loki地址,修改clients - url 的IP地址
#vi /dockerdata/loki/promtail-config.yaml

#Run Promtail
#docker run --name promtail -d -v /dockerdata/loki:/mnt/config -v /dockerdata/loki/promtailLog:/var/log  grafana/promtail  -config.file=/mnt/config/promtail-config.yaml

測試站點

Curl -I  http://192.168.1.5:3100

清理過期日誌

loki-config.yaml中加入以下配置,注意這裏的時間小時數必須是168的倍數。

table_manager:
  retention_deletes_enabled: true
  retention_period: 336h

添加後的loki-config.yaml預覽

auth_enabled: false

server:
  http_listen_port: 3100
  grpc_listen_port: 9096

common:
  path_prefix: /tmp/loki
  storage:
    filesystem:
      chunks_directory: /tmp/loki/chunks
      rules_directory: /tmp/loki/rules
  replication_factor: 1
  ring:
    instance_addr: 127.0.0.1
    kvstore:
      store: inmemory

schema_config:
  configs:
    - from: 2020-10-24
      store: boltdb-shipper
      object_store: filesystem
      schema: v11
      index:
        prefix: index_
        period: 24h

ruler:
  alertmanager_url: http://localhost:9093

table_manager:
  retention_deletes_enabled: true
  retention_period: 336h

Serilog 寫入Loki日誌

Neget安裝以下Neget

Serilog.AspNetCore
Serilog.Sinks.Grafana.Loki

Program.cs添加Loki配置

using Serilog;
using Serilog.Events;
using Serilog.Sinks.Grafana.Loki;

var builder = WebApplication.CreateBuilder(args);


builder.Services.AddControllers();

builder.Host.UseSerilog((hostingContext, loggerConfiguration) =>
{
    //添加Label
    List<LokiLabel> labels = new List<LokiLabel>();
    labels.Add(new LokiLabel { Key = "App", Value = "testproject" });

    loggerConfiguration
    .Enrich.FromLogContext()
    .WriteTo.Console()
    .WriteTo.Debug()
   //過濾Net Core系統日誌
   .MinimumLevel.Override("Microsoft", LogEventLevel.Warning)

   //日誌中包含項目信息
   .Enrich.WithProperty("app", hostingContext.HostingEnvironment.ApplicationName)

   //Loki地址配置信息
   .WriteTo.GrafanaLoki("http://192.168.1.5:3100", labels);
});

var app = builder.Build();

app.UseAuthorization();

//添加中間件簡化請求日誌記錄
app.UseSerilogRequestLogging();

app.MapControllers();

app.Run();

控制檯寫入日誌

using Microsoft.AspNetCore.Mvc;

namespace WebApplication1.Controllers
{
    [ApiController]
    [Route("[controller]")]
    public class WeatherForecastController : ControllerBase
    {
        private readonly ILogger<WeatherForecastController> _logger;

        public WeatherForecastController(ILogger<WeatherForecastController> logger) => _logger = logger;

        [HttpGet]
        public string Get()
        {
            _logger.LogInformation("我愛中國");
            _logger.LogInformation(Guid.NewGuid().ToString());
            return Guid.NewGuid().ToString();
        }
    }
}

Grafana添加Loki

Grafana部署參考這篇博客

添加Loki數據源

填入Loki地址然後保存

Explore中選擇添加的Loki數據源查詢日誌

Grafana查詢日誌

根據標籤{App="testproject"}查詢日誌,多個標籤寫法{app="mysql",name="mysql-backup"}

根據關鍵字查詢{App="testproject"} |= "65",目前好像不支持中文查詢

查詢不包含某字符串的日誌{App="testproject"} != "65"

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章