Seqによる無料ログ管理基盤の構築とKubernetesデプロイ

シーケンス(Seq)概要と主要機能

SeqはDatalust社が開発する構造化ログ検索・分析プラットフォームです。.NETエコシステムに深く最適化されており、スタンドアロン実行またはコンテナネイティブでの展開が可能です。個人開発や評価用途ではコミュニティライセンスが無償で提供されています。

  • 複数のプログラミング言語向けSDKを備え、特にC#関連ライブラリが充実
  • メッセージテンプレートによるプレインテキストとメタデータのシームレスな結合
  • SQL準拠の探索言語、C#スタイル演算子、配列・文字列操作関数を内蔵した高度なフィルター機構
  • ウィジェットベースのカスタマイズ可能な監視ダッシュボード
  • .NET製プラグインによる拡張性(Webhook通知、メール送信、ヘルスチェック等)
  • REST APIおよび専用のCLIクライアントによるログ書き込みと遠隔管理
  • DockerイベントストリームおよびOpenShift/Kubernetes統合エージェントのネイティブサポート

Kubernetes環境へのコンテナ展開

公式Dockerイメージを用いた展開が最も一般的です。ステートレスなログ収集インフラの場合、再作成時のデータ消失が許容される設計であれば永続ボリュームのマウントは不要です。監査要件や長期的な分析のために履歴を保持する場合は、/dataディレクトリをPersistentVolumeClaimにバインドする必要があります。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: seq-logger
  namespace: monitoring
  labels:
    app: seq-logger
    tier: backend
spec:
  replicas: 1
  selector:
    matchLabels:
      app: seq-logger
  template:
    metadata:
      labels:
        app: seq-logger
    spec:
      containers:
      - name: seq-core
        image: datalust/seq:latest
        imagePullPolicy: Always
        env:
        - name: ACCEPT_EULA
          value: "Y"
        resources:
          requests:
            cpu: "100m"
            memory: "768Mi"
          limits:
            cpu: "1"
            memory: "3Gi"
        ports:
        - containerPort: 80
          protocol: TCP
          name: web-interface
        - containerPort: 5341
          protocol: TCP
          name: ingestion-endpoint
---
apiVersion: v1
kind: Service
metadata:
  name: seq-gateway
  namespace: monitoring
spec:
  type: ClusterIP
  selector:
    app: seq-logger
  ports:
  - name: http-ui
    port: 80
    targetPort: 80
  - name: tcp-ingest
    port: 5341
    targetPort: 5341

上記マニフェストでは内部ネットワーク通信を前提としたClusterIPタイプのServiceを作成しています。外部から直接アクセスさせる場合はNodePortまたはIngressリソースと組み合わせてTLS終端を行う構成に変更してください。

ASP.NET CoreとのNLog統合手順

.NETアプリケーション側では、NLogを介して構造化ペイロードを生成しSeqエンドポイントへPOST送信する流れが標準的です。

NuGet依存関係の追加

プロジェクトルートで以下のコマンドを実行し、公式ターゲットを参照可能にします。

dotnet add package 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">
  <extensions>
    <add assembly="NLog.Targets.Seq"/>
  </extensions>
  
  <targets>
    <target name="remoteSeq" xsi:type="BufferingWrapper" bufferSize="400" flushTimeout="2000">
      <target xsi:type="Seq" serverUrl="http://seq-gateway.monitoring:5341" apiKey="" />
    </target>
  </targets>
  
  <rules>
    <logger name="*" minlevel="Info" writeTo="remoteSeq" />
  </rules>
</nlog>

serverUrlには実環境でのServiceアドレスまたはIngressホストを指定します。ApiKeyが有効化されている場合は文字列を入力し、匿名公開モードの場合は空欄のままにします。<property>タグによりスレッドIDやホスト名などの固定・動的属性をログレコードに付与できます。

運用向け詳細設定例

ファイルローテーション、コンソール可視化、および中央集約ログ配信を並行して実行する本番向きの構成例を示します。非同期I/Oの有効化と内部エラー追跡オプションを適用することで、ランタイムへのオーバーヘッドを最小限に抑えます。

<?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"
      internalLogLevel="Warn"
      internalLogFile="./app_debug/nlog.trace.txt"
      throwConfigExceptions="true">

  <variable name="archiveRoot" value="./archives/logs"/>

  <extensions>
    <add assembly="NLog.Web.AspNetCore"/>
    <add assembly="NLog.Targets.Seq"/>
  </extensions>

  <targets async="true">
    <!-- 開発者用リアルタイム確認 -->
    <target name="termStream" xsi:type="ColoredConsole"
            layout="${pad:padding=-5:${level:uppercase=true}} | ${message}" />

    <!-- ディスクへの世代管理付き保存 -->
    <target xsi:type="File" name="diskArchiver"
            fileName="${archiveRoot}/${level}/${shortdate}.log"
            archiveAboveSize="52428800" maxArchiveFiles="25"
            archiveNumbering="Date" layout="${longdate} | ${logger} | ${message}${newline}${onexception}${exception:format=tostring}${newline}" />

    <!-- Seq集中集約ノード -->
    <target name="clusterSeq" xsi:type="BufferingWrapper" bufferSize="600" flushTimeout="1500">
      <target xsi:type="Seq" serverUrl="https://seq.example.com/api/events" apiKey="secure-token-placeholder">
        <property name="ProcessHandle" value="${processid}" as="number" />
        <property name="NodeIdentifier" value="${machinename}" />
        <property name="DeploymentStage" value="${configsetting:default=staging:APP_STAGE=production}" />
        <property name="ExecutionStack" value="${callsite}" />
        <property name="OriginAddress" value="${aspnet-request-ip}" />
        <property name="EndpointRoute" value="${aspnet-request-url:IncludeHost=true:IncludeQueryString=true}" />
        <property name="ResponseCode" value="${aspnet-response-statuscode}" />
      </target>
    </target>
  </targets>

  <rules>
    <logger name="*" minlevel="Trace" writeTo="clusterSeq" />
    <logger name="*" levels="Debug,Info" writeTo="diskArchiver" />
    <logger name="*" level="Error,Fatal" writeTo="termStream,diskArchiver" />
  </rules>
</nlog>

この構成では低重要度ログをディスクに格納しつつ、すべてのトレースレベル情報をSeqクラスタへ流し込みます。ダッシュボード上で指定したカスタムプロパティをフィルタ条件として選択することで、特定のマイクロサービスやHTTPステータスコードに起因する異常検知を直感的に行うことが可能になります。

タグ: Seq Kubernetes NLog ASP.NET Core 構造化ログ

5月11日 23:03 投稿