Mark Ku's Blog

Qnap Docker Station 架設 輕量級日誌儲存、查詢、分析 日誌服務(Seq log server) - 本篇以 Net Core + Nlog 為例

問題

隨著網站及分散架構服務越來越多,當我們在除錯問題時,若日誌分散在各自的伺服器及容器中,變得不好追蹤,更不容易查出關鍵問題,因此導入日誌聚合服務就很重要。

評估

常見日誌聚合的服務有 ELK、Exceptionless、Seq、Splunk,在前公司有用 ELK,ELK 擁有相當豐富的功能,但對於小團隊要維護這個服務,過於龐大,且需要的系統資源更多,而在實際體驗過後,操作查詢界面上,我個人還是偏好 Seq。

那麼,我們開始動手架設 Seq Log Server

建立 > 搜尋 > seq > 對 "datalust\seq" > 安裝

Qnap Container Station 搜尋 datalust/seq 並安裝
Qnap Container Station 搜尋 datalust/seq 並安裝

將環境變數改成 ACCEPT_EULA=Y

建立容器環境變數ACCEPT EULA設為Y
建立容器環境變數ACCEPT EULA設為Y

如果沒有 QNAP 的 NAS,也可以透過 Docker 安裝

docker run --name seq -e ACCEPT_EULA=Y -p 8900:80 -p 5341:5341 datalust/seq

當SEQ 容器應用啟動後,點擊紅框的連結圖示進入後台

Qnap Container Station Seq容器連結圖示
Qnap Container Station Seq容器連結圖示

接著,我們替 Nlog 寫入,建立一組 API KEY

在進入後台後 > 點擊帳號頭像 > API KES

Seq 後台帳號選單中紅框標示的 API keys 選項
Seq 後台帳號選單中紅框標示的 API keys 選項

ADD API KEY > 輸入 Api key 的名稱

Seq 建立 API Key 的設定介面
Seq 建立 API Key 的設定介面

複製產生的 Api Key 到 nlog 的設定檔中

API Key Token 產生視窗與金鑰
(此token 己作廢 )

開啟 net core 專案,並安裝 nlog 相關的擴充套件

NLog.Extensions.Logging // 跳過所有級別的Microsoft組件的日誌記錄
NLog.Targets.Seq

nlog.config 配置

<?xml version="1.0" encoding="utf-8"?>

<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      autoReload="true"
      throwConfigExceptions="true"
      internalLogToConsole="true"
      internalLogLevel="Info" internalLogFile="D:\temp\nlog-internal.log"
	  >

  <!--加載ASP.NET Core插件-->
  <extensions>
    <add assembly="NLog.Web.AspNetCore" />
    <add assembly="NLog.Extensions.Logging" />
    <add assembly="NLog.Targets.Seq" />
  </extensions>

  <variable name="log-root" value="Log" />
  <variable name="log-daily" value="${log-root}/${date:format=yyyy-MM}/${shortdate}" />
  <!-- the targets to write to -->
  <targets>
     <target name="seq" xsi:type="BufferingWrapper" bufferSize="1000" flushTimeout="2000">
      <target xsi:type="Seq" serverUrl="http://{your seq server url}/" apiKey="{api key}">
        <property name="ThreadId" value="${threadid}" as="number" /> 
        <property name="MachineName" value="${machinename}" />
        <property name="Environment" value="${aspnet-environment}" />
        <property name="Logger" value="${logger}" />
        <property name="IP" value="${aspnet-request-ip}" />
        <property name="Url" value="${aspnet-request-url:IncludeHost=true:IncludePort=true:IncludeQueryString=true:IncludeScheme=true}" />
        <property name="Code" value="${aspnet-response-statuscode}" />
        <property name="TraceId" value="${aspnet-TraceIdentifier:ignoreActivityId=true}" />
        <property name="ActivityId" value="${activityid}" />
        <property name="RequestHeaders" value="${aspnet-request-headers:HeaderNames=Host,Referer,Origin,Authorization}" />
        <property name="RequestQueryString" value="${aspnet-request-querystring}" />
        <property name="RequestBody" value="${aspnet-request-posted-body}" />
        <property name="ClientIP" value="${aspnet-request-ip}" />
		<property name="Custom" value="${gdc:item=Custom}" />        
        <property name="CorrelationId" value="${aspnet-TraceIdentifier}" />
        <property name="AppName" value="Shop" />
      </target>
    </target>
  </targets>

  <!-- rules to map from logger name to target -->
  <rules>
    <!--跳過所有級別的Microsoft組件的日誌記錄-->
    <logger name="Microsoft.*" minlevel="Trace" final="true" />
	<!--跳过所有级别的CorrelationId组件的Info 層級下的 Log-->
    <logger name="CorrelationId.*" minlevel="Trace" maxlevel="Info" final="true" />
    <logger name="*" minlevel="Info" writeTo="seq" />
  </rules>
</nlog>

此時站台和服務啟動,log server 將會陸續收到 net core 網站透過 nlog 寫入的log

Seq 日誌伺服器介面顯示 Net Core 網站的日誌列表
Seq 日誌伺服器介面顯示 Net Core 網站的日誌列表

查看錯誤詳細資訊

Seq log server 顯示錯誤日誌與詳細資訊
Seq log server 顯示錯誤日誌與詳細資訊

可以依據錯誤級別來查詢

Seq 介面顯示依錯誤級別篩選的日誌
Seq 介面顯示依錯誤級別篩選的日誌

關鍵字搜索功能

Seq日誌伺服器顯示錯誤日誌查詢結果
Seq日誌伺服器顯示錯誤日誌查詢結果

統計報表日誌

Seq 儀表板顯示日誌事件、錯誤與類型統計
Seq 儀表板顯示日誌事件、錯誤與類型統計

更酷的是! 你也可以透過 Sql 語法來查詢 log

Seq日誌介面顯示關鍵字查詢錯誤訊息
Seq日誌介面顯示關鍵字查詢錯誤訊息
常見的 seq 查詢語句

like 查询
@Message like '%notify%'

查詢 Error 級別的 log
@Level = 'Error'

找 shop 相關的 log
app = 'shop'

統計各log級別的數量
select count(1) from stream group by @Level

查詢 notify 相關 log
select datepart( @Timestamp,'day',8h) as GMT8_Day,datepart( @Timestamp,'hour',8h)  as GMT8_Hour,  datepart( @Timestamp,'minute',8h)  as GMT8_Minute,ToIsoString(@Timestamp) as GMT0,  @Level, ToHexString(@EventType) as EventType,  @Message, @Exception, @Properties
from stream where @Message like 'notify%' 
order by GMT0 desc 

小結

Seq log server 功能很多,相當的輕巧,配置也很容易,維護的成本也不高,很適合小團隊使用。

##補充 - 前端的 log 也能透過 seq-logging,將 log 傳送到 seq server去。 前端套件Gihub

作者

Mark Ku

擁有 10+ 年經驗的資深軟體工程師,現為 AI 應用 Builder,專注於大型平台架構與簡化複雜系統設計,從電商系統到訂閱與收費平台,結合 AI Agent、AI 整合與自動化開發,打造高效率且可持續演進的產品技術基礎。閱讀更多

覺得這篇有幫助?

作者做的免費工具、每日 Podcast 與電子報,都在這裡。

Mark Ku · 本文採用 CC BY 4.0 授權,轉載請註明作者並附上原文連結。

留言

訂閱電子報

訂閱後即時收到新文章通知,不錯過任何技術分享。

提交即表示同意接收電子報,隨時可

熱門文章

View all
Mark Ku
··597

Oracle Cloud 永久免費方案 Linux 主機及固定 IP :0 元打造雲端解決方案

Oracle Cloud 永久免費方案 Linux 主機及固定 IP :0 元打造雲端解決方案
Mark Ku
··469

告別 Postman 收費陷阱!開源 Git 原生 API 測試神器 Bruno 實戰指南

告別 Postman 收費陷阱!開源 Git 原生 API 測試神器 Bruno 實戰指南
Mark Ku
··327

一款免費開源類似於 Notion 類知識庫系統 — Outline Wiki 佈署與備份全攻略

一款免費開源類似於 Notion 類知識庫系統 — Outline Wiki 佈署與備份全攻略
Mark Ku
··239

打造高效 API 管理平台:從 0 開始部署 Kong Gateway - Part 1

打造高效 API 管理平台:從 0 開始部署 Kong Gateway - Part 1
Mark Ku
··233

訓練自己的 AI 語音:硬體門檻、開源模型比較與 LoRA 微調

訓練自己的 AI 語音:硬體門檻、開源模型比較與 LoRA 微調
Mark Ku
··220

在 Ubuntu 上設置 Samba 來共享資料夾,讓 Windows 11 用戶可以存取

在 Ubuntu 上設置 Samba 來共享資料夾,讓 Windows 11 用戶可以存取