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"