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"

posted @ 2022-11-15 13:13  雨水的命运  阅读(563)  评论(0编辑  收藏  举报