簡介
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"