Mark Ku's Blog
首頁 關於我
Qnap Docker Station 架設 輕量級日誌儲存、查詢、分析 日誌服務(Seq log server) - 本篇以 Net Core + Nlog 為例
NETCORE
Qnap Docker Station 架設 輕量級日誌儲存、查詢、分析 日誌服務(Seq log server) - 本篇以 Net Core + Nlog 為例
Mark Ku
Mark Ku
December 23, 2021
1 min

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

問題

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

評估

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

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

建立 > 搜尋 > seq > 對 “datalust\seq” > 安裝

將環境變數改成 ACCEPT_EULA=Y

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

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

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

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

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

ADD API KEY > 輸入 Api key 的名稱

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


(此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

查看錯誤詳細資訊

可以依據錯誤級別來查詢

關鍵字搜索功能

統計報表日誌

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

常見的 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


Tags

Mark Ku

Mark Ku

Software Developer

9年以上豐富網站開發經驗,開發過各種網站,電子商務、平台網站、直播系統、POS系統、SEO 優化、金流串接、AI 串接,Infra 出身,帶過幾次團隊,也加入過大團隊一起開發。

Expertise

前端(React)
後端(C#)
網路管理
DevOps
溝通
領導

Social Media

facebook github website

Related Posts

使用 Seq log server 達成金流及訂單異常事件監控通知
使用 Seq log server 達成金流及訂單異常事件監控通知
April 18, 2023
1 min

Quick Links

關於我

Social Media