---
title: "Qnap Docker Station 架設 輕量級日誌儲存、查詢、分析 日誌服務(Seq log server) - 本篇以 Net Core + Nlog 為例"
description: "說明如何在 QNAP Docker Station 上架設輕量級 Seq 日誌伺服器，並以 .NET Core + NLog 為例，整合結構化日誌查詢、SQL 語法搜尋與統計報表功能。"
canonical_url: "https://blog.markkulab.net/post/seq-log-server"
author: "Mark Ku"
author_url: "https://blog.markkulab.net/author/mark-ku"
site: "Mark Ku's Blog"
date_published: "2021-12-24 01:01:01 +0800"
category: ".NET Core"
tags: ["seq", "log server", "nlog", "net core", "docker", "qnap"]
language: "zh-TW"
license: "CC BY 4.0"
license_url: "https://creativecommons.org/licenses/by/4.0/"
attribution: "轉載或引用請註明作者並附上原文連結"
---

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

## 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 並安裝](https://blog.markkulab.net/content/markku/posts/seq-log-server/images/vOKFKGb.png)

### 將環境變數改成 ACCEPT_EULA=Y
![建立容器環境變數ACCEPT EULA設為Y](https://blog.markkulab.net/content/markku/posts/seq-log-server/images/4GMQUf2.png)

如果沒有 QNAP 的 NAS，也可以透過 Docker 安裝
```
docker run --name seq -e ACCEPT_EULA=Y -p 8900:80 -p 5341:5341 datalust/seq
```

### 當SEQ 容器應用啟動後，點擊紅框的連結圖示進入後台
![Qnap Container Station Seq容器連結圖示](https://blog.markkulab.net/content/markku/posts/seq-log-server/images/FXjmVRc.png)

## 接著，我們替 Nlog 寫入，建立一組 API KEY
### 在進入後台後 > 點擊帳號頭像 > API KES   
![Seq 後台帳號選單中紅框標示的 API keys 選項](https://blog.markkulab.net/content/markku/posts/seq-log-server/images/jcHdzJT.png)

### ADD API KEY > 輸入 Api key 的名稱
![Seq 建立 API Key 的設定介面](https://blog.markkulab.net/content/markku/posts/seq-log-server/images/iljGFAT.png)

### 複製產生的 Api Key 到 nlog 的設定檔中
![API Key Token 產生視窗與金鑰](https://blog.markkulab.net/content/markku/posts/seq-log-server/images/HLthY8U.png)  
(此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 網站的日誌列表](https://blog.markkulab.net/content/markku/posts/seq-log-server/images/veeXaaX.png)

### 查看錯誤詳細資訊
![Seq log server 顯示錯誤日誌與詳細資訊](https://blog.markkulab.net/content/markku/posts/seq-log-server/images/6g5ZVQd.png)

### 可以依據錯誤級別來查詢

![Seq 介面顯示依錯誤級別篩選的日誌](https://blog.markkulab.net/content/markku/posts/seq-log-server/images/gPPpqsk.png)

### 關鍵字搜索功能
![Seq日誌伺服器顯示錯誤日誌查詢結果](https://blog.markkulab.net/content/markku/posts/seq-log-server/images/wnB6q8d.png)

### 統計報表日誌
![Seq 儀表板顯示日誌事件、錯誤與類型統計](https://blog.markkulab.net/content/markku/posts/seq-log-server/images/xBzg0p6.png)

### 更酷的是! 你也可以透過 Sql 語法來查詢 log
![Seq日誌介面顯示關鍵字查詢錯誤訊息](https://blog.markkulab.net/content/markku/posts/seq-log-server/images/anX4XtQ.png)

```
常見的 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](https://github.com/datalust/seq-logging)

---

## 關於本文與作者

本文出自 [Mark Ku's Blog](https://blog.markkulab.net/post/seq-log-server)

授權條款： [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/) — 轉載或引用請註明作者並附上原文連結

### 關於作者

**[Mark Ku](https://blog.markkulab.net/author/mark-ku)** — Software Solution Provider

- 10+ 年資深軟體工程師，現為 AI 應用 Builder
- 專注大型平台架構設計，從北美電商到AI SaaS訂閱收費系統
- 結合 AI Agent 與自動化，打造高效可演進的產品技術基礎

### 作者開發的免費工具

以下工具皆可免費使用：

- [免費 PDF 簽名工具](https://blog.markkulab.net/tools/pdf-sign): 線上 PDF 簽名工具，瀏覽器內完成手繪、打字、上傳簽名，可拖曳放置、縮放、下載。所有處理都在你的裝置完成，檔案不會上傳。
- [VS Code Refactory](https://blog.markkulab.net/tools/refactory): Refactory 是一款 VS Code 重構擴充套件：34 個重構動作、37 條 code smell 檢查、Code Health 儀表板、18 種語言、534 支測試。懂你的專案慣例：介面放哪、DI 註冊寫在哪、'use client' 該不該加；還會用 git 修改頻率 × 複雜度排出「該先修哪個檔案」，並一鍵把壞味道交給你自己電腦上的 Claude Code 修。免費使用，原始碼不離開你的機器。
- [DB-Kit 資料庫管理工具](https://blog.markkulab.net/tools/db-kit): DB-Kit 是一個用 Tauri + Rust + React 打造的輕量跨平台資料庫管理工具，用單一一致的介面同時管理 MySQL、MariaDB、PostgreSQL、SQL Server、Oracle、SQLite、MongoDB、Redis、Kafka、Elasticsearch 與 RabbitMQ 十一種資料來源：連線密碼以 OS keychain 加密、SSH Tunnel、完整 CRUD、視覺化查詢建構器、多結果集同時顯示、跨連線資料傳輸與比對同步、Excel / CSV 匯入匯出、執行計畫視覺化、ER 圖、排程備份、SQL 壓力測試（p50～p99 延遲百分位）、15 條規則的 SQL 審查、Kafka 訊息瀏覽與監控告警；繁中 / 英文雙語介面，內建 AI 助手（自然語言生成 SQL、AI 審查與調校建議）與命令列工具 dbk。免費開源（MIT），提供 Windows / macOS / Linux 安裝檔。
- [VS Code Super Mermaid](https://blog.markkulab.net/tools/super-mermaid): Super Mermaid 是一款 VS Code 擴充套件：開箱即用的漂亮 Mermaid 圖表，自動上色、即時預覽、滑鼠平移縮放、PNG / SVG 高解析匯出，內建 21 種範本與多種主題。免費開源（MIT）。
- [React Super Mermaid](https://blog.markkulab.net/tools/react-super-mermaid): react-super-mermaid 是一個開源 React 元件庫：一行 <MermaidViewer> 即可渲染漂亮的 Mermaid 圖表，內建 colorful / sketch 主題、平移縮放、圖內搜尋、SVG / PNG 高解析匯出。輕量、SSR 安全、完整 TypeScript 型別。免費開源（MIT）。
- [Jira / Confluence Super Mermaid](https://blog.markkulab.net/tools/jira-super-mermaid): Atlassian Forge app：在 Jira issue 與 Confluence 內文直接寫 Mermaid 語法，畫流程圖、時序圖、狀態機與甘特圖。11 種圖表、SVG / PNG 匯出、明暗主題、完整中日韓文字支援。取得 Runs on Atlassian 資格：圖表存在你自己的站台，app 不呼叫任何第三方服務。免費，即將上架 Atlassian Marketplace。
- [Mermaid 線上預覽](https://blog.markkulab.net/tools/mermaid-preview): 在瀏覽器裡寫 Mermaid、即時看圖，整張圖表壓進網址就能分享。免註冊、不上傳伺服器，相容 mermaid.live 的分享連結。
- [React Intl Phone Number](https://blog.markkulab.net/tools/react-intl-phone-number): react-intl-phone-number 是一個開源 React 元件：framework-agnostic、不依賴 antd，提供 E.164 進出、可搜尋國旗 / 國碼下拉、可配置驗證等級（strict / mobile-strict / loose）、可主題化 CSS 與 i18n，電話邏輯由 google-libphonenumber 驅動。輕量、完整 TypeScript 型別。免費開源（MIT）。
- [Uptime Kuma Cluster](https://blog.markkulab.net/tools/uptime-kuma-cluster): 把單機版 Uptime Kuma 改造成高可用叢集：OpenResty + Lua 智慧負載平衡、MariaDB 共享狀態、健康檢查與自動 Failover，附叢集管理 REST API，一行 Docker Compose 啟動。免費開源（MIT）。
- [特教專案](https://blog.markkulab.net/education): 為特殊教育學生製作的學習教材

### 每日 Podcast

- [科技新鮮事](https://blog.markkulab.net/category/tech-news): 每日精選 AI 與科技趨勢，透過語音摘要快速掌握最新技術動態，涵蓋 AI 應用、軟體架構、DevOps 與工程實戰。 — RSS: https://blog.markkulab.net/feed.xml
- [AI股市蝦聊](https://blog.markkulab.net/category/ai-stock-chat): 每個交易日用 AI 分析台股盤勢，以雙人對話聊當天的盤中觀察與隔日預測。 — RSS: https://blog.markkulab.net/ai-stock-chat/feed.xml

### 電子報

[訂閱電子報](https://blog.markkulab.net/subscribe) — 第一時間收到新文章通知，無垃圾信、隨時可取消訂閱。
