1. はじめに
実践に入る前に、外部のログ収集システムがなぜ必要か整理しよう。自分のアプリが家庭用PCじゃなくて本番環境にデプロイされている状況を想像してみて:何百台ものサーバー、マイクロサービス、たくさんのユーザー、誰かが「アプリが重い」って文句を言う。そんな大量のログの中から目的のイベントを見つけるのは干し草の山から針を探すようなものだ。集中ログ収集が無ければ、こういうアプリのデバッグや運用はほぼ不可能。そこでSeqとApplication Insightsが登場するんだ。
Seq:使いやすいUI、高速検索、リアルタイム
Seqは構造化ログの集中収集と分析向けのシステムで、.NETとSerilogに最適化されてる。単なるログファイルを集めるサービスじゃなくて強力なツールで、リアルタイムにログストリームを見たり、プロパティでフィルタしたり、アラートを作ったりできる。Seqはローカルでもクラウドでも動かせるよ。
なぜSeqを選ぶのか?
- .NETとSerilogに最適化されていて、すぐ動く。
- メッセージのあらゆるプロパティでの検索とフィルタが爆速。
- シンプルで使いやすいウェブUI。
- 余計な手続きなしにローカルで立てられる、ノートPCでもOK。
シンプルなアーキテクチャはこんな感じ
+--------------+ +-------------+ +-------------+
| .NET-アプリ | --(ログ)| Serilog | --(http)| Seq |
+--------------+ +-------------+ +-------------+
| ^
| |
(検索、フィルタ、 <----[Web UI]
アラート、統合)
アプリはSerilog経由で構造化ログを書き、SerilogがそれをSeqに送る。SeqのウェブUIで好きなことをすればいい。
2. Serilog と Seq の統合
Seq のインストール
Seqはローカルでも手早く試せる。例えばWindowsなら公式サイトからSeqをダウンロードしてみて(公式サイト)。
- Seqをダウンロードしてインストールする。
- インストール後、ウェブUIを開く(通常は http://localhost:5341)。
- 準備完了!あとはログ送信を設定するだけ。
Serilog を Seq に統合する
NuGetパッケージのインストール:
dotnet add package Serilog.Sinks.Seq
Program.csでのログ設定の例:
using Serilog;
public class Program
{
public static void Main(string[] args)
{
// SerilogをSeqに出力する設定
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Information()
.WriteTo.Console()
.WriteTo.Seq("http://localhost:5341") // あなたのSeqサーバーのURL
.CreateLogger();
Log.Information("アプリケーションが起動します");
// ... アプリの他のコード ...
Log.CloseAndFlush();
}
}
設定が正しければ、アプリからのログがSeqに流れてくるはずだ。
構造化イベントの例
Log.Information("ユーザー {User} が {Time} にログインしました", userName, DateTime.UtcNow);
Seqでは特定ユーザーのログインだけ検索できる:
User == 'vasya'
フィルタと検索
Seqは任意のフィールドと値でイベントをフィルタできる。例えば今日のエラーだけ見たい?フィルタをこう書けばOK:
@Level = 'Error' and @Timestamp > today()
条件を組み合わせられるから超便利だよ!
アラートと統合
Seqはアラート作成が可能:例えばエラー数が閾値を超えたらメールが飛ぶ、webhookが叩かれる、Slackに通知することもできる。
その他の機能
- CI/CDと統合してテストログを自動収集できる。
- カスタムダッシュボード(追加料金で利用可)。
- ログ解析プラグインやアクション自動化(例:障害で自動的にバグを作る)。
- Grafana/Prometheusとプラグイン経由で連携可能。
Seq 設定での典型的ミス
よくある問題は、Serilogに指定するSeqサーバーのURLを間違えるか、Seqが別ポートで待ち受けていること。
また、SeqをDockerやサーバーで動かしている場合、受信ポートを開放していないことも多い。アプリからSeqへ接続できるかポートの到達性を確認しよう。
3. Application Insights:.NET向けテレメトリ、クラウドの利点
Application Insights(別名 "App Insights")はMicrosoft Azureのアプリ監視・解析クラウドプラットフォームだ。ログ収集だけでなく、異常検出、利用解析、依存関係やリクエストの監視、外部APIの追跡、そしてリアルタイムの可視化までこなす。AzureのApplication Insightsはエンタープライズな.NET界隈での標準的ツールだよ。
Application Insights の利点
- 別サーバーのインストール不要:全部クラウドで済む。
- .NET、ASP.NET、Azure、Visual Studioと深く統合されている。
- ログだけでなくメトリクス、エラー、リクエスト、SQLクエリなども自動収集する。
- ダッシュボード作成、SLA監視、異常検出、分散トレースの解析が可能。
Application Insights はどう動く?
+--------------+ +-------------------+ +---------------------+
| .NET-アプリ | --(SDK)| AppInsights SDK | --(https)| Azure Application |
+--------------+ +-------------------+ | Insights (cloud) |
+---------------------+
^ |
(W3C Trace +----> 分析、検索、ダッシュボード
Context)
SDKを組み込んだアプリがテレメトリをAzureのクラウドに送る。分析と可視化はAzureポータルのウェブUIでやるんだ。
.NETアプリへの Application Insights 統合
オプション1: 簡単に始める
ASP.NET Coreアプリならめっちゃ簡単:
dotnet add package Microsoft.ApplicationInsights.AspNetCore
Program.csでは:
builder.Services.AddApplicationInsightsTelemetry("<あなたのインストルメンテーションキー>");
コンソールやデスクトップアプリなら:
dotnet add package Microsoft.ApplicationInsights
初期化:
using Microsoft.ApplicationInsights;
using Microsoft.ApplicationInsights.Extensibility;
var telemetryConfig = TelemetryConfiguration.CreateDefault();
telemetryConfig.InstrumentationKey = "<あなたのインストルメンテーションキー>";
var telemetryClient = new TelemetryClient(telemetryConfig);
telemetryClient.TrackTrace("Application Insights からの挨拶!");
telemetryClient.TrackException(new Exception("おっと、エラーが発生しました!"));
インストルメンテーションキーはAzureポータルでApplication Insightsリソースを作成した後に取得する必要がある。
構造化データを送るには?
各トレースにプロパティを追加できるよ:
telemetryClient.TrackTrace("ユーザーがログインしました",
new Dictionary<string, string> { ["User"] = userName }
);
例: ユーザー操作のログ
ユーザーのログインを記録したいとする:
var props = new Dictionary<string, string>
{
{ "User", userName },
{ "Time", DateTime.UtcNow.ToString("o") }
};
telemetryClient.TrackEvent("UserLogin", props);
これでイベント本体だけでなくプロパティもポータル上で確認できる。
4. 便利なポイント
Application Insightsで何が見える?
- アプリ概要: リクエスト数、エラー、依存関係(例:SQLクエリ)。
- ログ検索: 任意のイベント、プロパティでのフィルタ。
- 可視化: グラフやダッシュボード。
- トレース: 呼び出しのチェーンや各操作にかかった時間を確認できる。
- アラート設定: 任意条件でアラートが設定可能。
Application Insights の構造を簡単に
| オブジェクト | 説明 |
|---|---|
| Trace | 文字列メッセージ(通常のログ)。 |
| Event | 任意のイベント(例:「購入」)。 |
| Exception | エラー/例外の情報。 |
| Dependency | 外部呼び出し(SQL、HTTPリクエストなど)。 |
| Metric | 数値指標(例:件数)。 |
| Request | ユーザーからのリクエスト(ウェブアプリ向け)。 |
Application Insights でのエラー検索の例
Azureポータルで簡単なクエリ(Kusto Query Language — KQL)を組める:
exceptions
| where timestamp > ago(1d)
| where outerMessage contains "Timeout"
| project timestamp, operation_Name, user_Id, outerMessage
これで過去24時間のタイムアウトを詳細付きで表示できる。
Application Insights の制約・注意点
- 利用にはAzureアカウントが必要。無料枠はあるが制限あり。
- ログ送信とUI反映の間に数分の遅延が発生することがある。
- 完全にプライベートなプロジェクトにはクラウドは適さない場合がある。
- トレースを出しすぎると日次の割当を簡単に使い切ってしまう。
5. Seq と Application Insights の比較
| Seq | Application Insights | |
|---|---|---|
| どこに保存されるか | ローカルサーバー(またはクラウド) | Azureのクラウド |
| コスト | ローカルなら無料/有料、オンプレ可能 | 無料ティアあり、Azure上で有料 |
| 最適な用途 | .NETアプリやローカルCI向け | あらゆるアプリ、プロダクション/エンタープライズ向け |
| UI/検索 | とても使いやすくフィルタが強力 | 解析機能が強力でダッシュボード豊富 |
| アラート | 組み込みで利用可能 | 複雑な条件やAzure連携が可能 |
| 統合 | Serilogなどのsinksに対応 | ASP.NET、.NET、JSなどのSDKあり |
| 柔軟性 | 自前でフルコントロールできる | Microsoftのエコシステムに最適化されている |
学んだことを実践で使う
Seq と Application Insights の知識は、本番だけじゃなく開発やテスト(例えば自動テストの挙動解析)、マイクロサービスの全体像把握でも役立つ。面接で「本番の問題を素早く見つけるためにログ収集をどう組む?」って聞かれたら答えられるはずだ。
さらに、多くの企業はこれらのシステムをDevOpsのチェーンに組み込んでいる:Continuous Delivery、アラートによる自動バグ作成など。ログ収集システムは単なる「Console.WriteLineの行き先」じゃなくて、アプリのブラックボックスであり監視システムなんだ。
GO TO FULL VERSION