Docker - 第九章 | 安裝 datalust seq
Seq 是一款使用現代化技術構建的結構化日誌存儲,查詢,分析工具。比起 ELK 這種組合要輕量級許多。只需要一個安裝包就具有數據存儲,查詢,圖表分析功能。它對 windows 友好,直接提供了安裝包。當然也可以使用 docker 來部署。Seq 對於單個用戶是免費的,這對於一些小團隊並沒有什麼問題。Seq 一個比較強大的功能是提供了類似 Sql 語句的數據查詢及處理能力,使得用戶可以直接寫 Select from 來得到自己想要的數據。
收費
免費的個人版,只能以一個使用者帳號連到網頁介面(沒有辦法做權限控管),而且同時只有一個session可以使用(以cookie:Seq-Session為準),可以在企業中使用這個版本
如果裝app在seq站台,app的行為會視為另一個使用者
在未啟用授權的狀況下,session數量不影響,但不能安裝app
環境 docker
啟動container,使用volumn mount實體路徑:
docker run --name seq -d --restart unless-stopped -e ACCEPT_EULA=Y -v D:\docker\seqdata:/data -p 5341:80 datalust/seq:latest
開發 (Microsoft.Extensions.Logging)
在 Program.cs
加入 Seq 的 Log Provider
builder.Logging.AddSeq();
如果要指定 Seq 伺服器位置與 API Key 的話,也可以這樣寫:
builder.Logging.AddSeq(serverUrl: "http://localhost:5341", apiKey: "your-api-key");
如果要直接從組態進行設定,可以這樣寫:
builder.Logging.AddSeq(builder.Configuration.GetSection("Seq"));
而 appsettings.json
的設定值如下:
{
"Seq": {
"ServerUrl": "http://localhost:5341",
"ApiKey": "1234567890",
"MinimumLevel": "Trace",
"LevelOverride": {
"Microsoft": "Warning"
}
}
}
開發 (Nlog)
nuget套件 - NLog.Targets.Seq
在 Program.cs
加入 Seq 的 Log Provider
#region 加入 NLog 相關資訊
// 環境的相關資訊
#if DEBUG
NLogBuilder.ConfigureNLog($"nlog.config").GetCurrentClassLogger();
#else
NLogBuilder.ConfigureNLog($"nlog.{environmentName}.config").GetCurrentClassLogger();
#endif
// 將NLog註冊到此專案內
builder.Logging.ClearProviders();
// 設定log紀錄的最小等級
builder.Logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Information);
builder.Host.UseNLog();
#endregion
<extensions>
<!-- 引用seq type -->
<add assembly="NLog.Targets.Seq"/>
</extensions>
<targets>
<!-- 使用AsyncWrapper(nlog原生)可提升效能,且當寫入seq有問題時不會影響應用程式結果 -->
<!-- 參考: https://github.com/NLog/NLog/wiki/AsyncWrapper-target -->
<target name="seq" xsi:type="AsyncWrapper" overflowAction="Discard" queueLimit="10000" batchSize="200" timeToSleepBetweenBatches="1">
<!-- 可以啟用apikey,只允許授權的key寫入log,也可做到群組統計的效果 -->
<target xsi:type="Seq" serverUrl="http://localhost:5341" apiKey="" >
<!-- property會一起帶到seq log裡,可作為filter欄位 -->
<property name="SourceContext" value="${logger}" />
<property name="ThreadId" value="${threadid}" as="number" />
<property name="MachineName" value="${machinename}" />
<property name="Environment" value="${windows-identity}" />
<property name="Application" value="KH.Lab.Seq" />
</target>
</target>
</targets>
測試記錄到Seq
修改 HomeController
類別,加入不同 Log Level 的紀錄
using Microsoft.AspNetCore.Mvc;
namespace KH.Lab.Seq.Controllers
{
[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
private static readonly string[] Summaries = new[]
{
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
};
private readonly ILogger<WeatherForecastController> _logger;
public WeatherForecastController(ILogger<WeatherForecastController> logger)
{
_logger = logger;
}
[HttpGet(Name = "GetWeatherForecast")]
public IEnumerable<WeatherForecast> Get()
{
_logger.LogTrace("這是 Trace");
_logger.LogDebug("這是 Debug");
_logger.LogInformation("這是 Information");
_logger.LogWarning("這是 Warning");
_logger.LogError("這是 Error");
_logger.LogCritical("這是 Critical");
return Enumerable.Range(1, 5).Select(index => new WeatherForecast
{
Date = DateTime.Now.AddDays(index),
TemperatureC = Random.Shared.Next(-20, 55),
Summary = Summaries[Random.Shared.Next(Summaries.Length)]
})
.ToArray();
}
}
}
網頁介面
透過signals設定區分不同過濾條件(例如站台名稱),等於建置索引,效能比較好 https://docs.datalust.co/docs/signals
Workspace只是影響進入時要顯示的幾個signals
從Settings->Retention設定清空events排程
可以設定占用記憶體跟硬碟最小剩餘空間多少後不再寫入