Skip to content

ログ(Serilogベース高性能ログ記録ライブラリ)

Serilogベースの高性能ログ記録ライブラリで、GameFrameXフレームワークに統一されたログ記録インターフェースと豊富なログ出力機能を提供します。

特徴

  • 複数ログレベル対応 - Verbose、Debug、Info、Warn、Error、Fatalの6つのログレベルをサポート
  • 複数出力先 - ファイル、コンソール、Grafana Lokiなど複数の出力方式をサポート
  • 柔軟な設定 - LogOptionsクラスによる豊富な設定オプションを提供
  • ファイルローテーション - 時間間隔とファイルサイズによるログファイルローテーションをサポート
  • タグサポート - ログにタグを追加し、分類とフィルタリングに活用
  • 例外記録 - 完全なスタックトレース情報を含む専用の例外記録メソッド
  • コンソール出力 - ログファイルとコンソールへの同時出力をサポート
  • 高性能 - Serilogベースで構築され、高性能なログ記録機能を提供

インストール

bash
dotnet add package GameFrameX.Foundation.Logger

クイックスタート

1. 基本的な使用方法

csharp
using GameFrameX.Foundation.Logger;

// デフォルト設定でログシステムを初期化
var logger = LogHandler.Create(LogOptions.Default);

// 異なるレベルのログを記録
LogHelper.Info("アプリケーション起動");
LogHelper.Warn("これは警告メッセージです");
LogHelper.Error("エラーが発生しました");

2. カスタム設定

csharp
using GameFrameX.Foundation.Logger;

// カスタムログ設定の作成
var logOptions = new LogOptions("mylogs")
{
    LogType = "WebApi",
    LogTagName = "Production",
    LogEventLevel = LogEventLevel.Information,
    IsConsole = true,
    RollingInterval = RollingInterval.Hour,
    FileSizeLimitBytes = 50 * 1024 * 1024, // 50MB
    RetainedFileCountLimit = 7 // 7ファイルを保持
};

// ログシステムの初期化
var logger = LogHandler.Create(logOptions);

// ログの使用
LogHelper.Info("サーバー", "ポート {Port} でサーバー起動", 8080);
LogHelper.InfoConsole("ファイルとコンソールの両方に出力されるメッセージ");

詳細な使い方

ログレベル

6つの標準ログレベルをサポートしています:

csharp
// Verbose - 最も詳細なログ情報
LogHelper.Verbose("詳細なデバッグ情報");

// Debug - デバッグ情報
LogHelper.Debug("デバッグ情報: 変数値 = {Value}", someValue);

// Information - 一般情報
LogHelper.Info("ユーザー {UserId} がログインに成功", userId);

// Warning - 警告情報
LogHelper.Warn("ディスク容量不足、残り: {FreeSpace}MB", freeSpace);

// Error - エラー情報
LogHelper.Error("データベース接続失敗: {Error}", errorMessage);

// Fatal - 致命的エラー
LogHelper.Fatal("アプリケーションがクラッシュ直前: {Reason}", reason);

例外記録

専用の例外記録メソッドにより、スタックトレースが自動的に含まれます:

csharp
try
{
    // 例外をスローする可能性のあるコード
    DoSomething();
}
catch (Exception ex)
{
    // 例外の記録
    LogHelper.Error(ex);
    
    // タグ付き例外記録
    LogHelper.Error("データベース", ex);
    
    // カスタム例外メッセージ
    LogHelper.Error("ユーザーリクエスト処理中にエラーが発生しました: {Message}", ex.Message);
}

タグサポート

ログにタグを追加し、分類とフィルタリングに活用します:

csharp
// タグ付きログ記録
LogHelper.Info("ユーザー管理", "ユーザー {UserId} の作成に成功", userId);
LogHelper.Warn("セキュリティ", "不審なログイン試行を検出、IP: {IP}", ipAddress);
LogHelper.Error("決済", "決済処理失敗、注文番号: {OrderId}", orderId);

// タグ付きコンソール出力
LogHelper.InfoConsole("起動", "サーバー起動完了、リスニングポート: {Port}", port);

コンソール出力

ログファイルとコンソールへの同時出力をサポートします:

csharp
// ログファイルのみに出力
LogHelper.Info("このメッセージはログファイルにのみ書き込まれます");

// ログファイルとコンソールの両方に出力
LogHelper.InfoConsole("このメッセージはコンソールとログファイルの両方に表示されます");

// エラーメッセージのコンソール出力(赤色で表示)
LogHelper.ErrorConsole("これはエラーメッセージで、コンソールに赤色で表示されます");

// コンソールのみに出力(ログファイルには書き込まない)
LogHelper.Console("このメッセージはコンソールにのみ表示されます");

設定

LogOptions 設定クラス

csharp
var logOptions = new LogOptions("logs") // ログディレクトリ名
{
    // 基本設定
    LogType = "WebServer",              // サーバー種別識別子
    LogTagName = "Production",          // ログタグ名
    LogEventLevel = LogEventLevel.Info, // 最低ログレベル
    
    // 出力設定
    IsConsole = true,                   // コンソール出力の有無
    
    // ファイル設定
    RollingInterval = RollingInterval.Day,    // ローテーション間隔(日)
    IsFileSizeLimit = true,                   // ファイルサイズ制限の有無
    FileSizeLimitBytes = 100 * 1024 * 1024,   // ファイルサイズ制限(100MB)
    RetainedFileCountLimit = 31,              // 保持ファイル数(31ファイル)
    
    // Grafana Loki 設定
    IsGrafanaLoki = false,                    // Loki有効フラグ
    GrafanaLokiUrl = "http://localhost:3100", // Lokiサービスアドレス
    GrafanaLokiLabels = new Dictionary<string, string>
    {
        ["app"] = "myapp",
        ["env"] = "production"
    },
    GrafanaLokiUsername = "admin",            // Lokiユーザー名
    GrafanaLokiPassword = "password"          // Lokiパスワード
};

ローテーション間隔オプション

csharp
// サポートされるローテーション間隔
RollingInterval.Infinite    // ローテーションなし
RollingInterval.Year        // 年単位でローテーション
RollingInterval.Month       // 月単位でローテーション
RollingInterval.Day         // 日単位でローテーション(デフォルト)
RollingInterval.Hour        // 時間単位でローテーション
RollingInterval.Minute      // 分単位でローテーション

ログレベル設定

csharp
// サポートされるログレベル
LogEventLevel.Verbose       // 最も詳細
LogEventLevel.Debug         // デバッグ(デフォルト)
LogEventLevel.Information   // 情報
LogEventLevel.Warning       // 警告
LogEventLevel.Error         // エラー
LogEventLevel.Fatal         // 致命的エラー

高度な使い方

Grafana Loki 統合

ログを Grafana Loki に送信して、集中化されたログ管理が可能です:

csharp
var logOptions = new LogOptions()
{
    IsGrafanaLoki = true,
    GrafanaLokiUrl = "http://loki.example.com:3100",
    GrafanaLokiLabels = new Dictionary<string, string>
    {
        ["service"] = "user-service",
        ["environment"] = "production",
        ["version"] = "1.0.0"
    },
    GrafanaLokiUsername = "your-username",
    GrafanaLokiPassword = "your-password"
};

var logger = LogHandler.Create(logOptions);

カスタムログ設定

コールバック関数を使用したより高度なカスタム設定をサポートします:

csharp
var logger = LogHandler.Create(logOptions, true, config =>
{
    // カスタムSinkの追加
    config.WriteTo.Email(
        fromEmail: "noreply@example.com",
        toEmail: "admin@example.com",
        outputTemplate: "{Timestamp} [{Level}] {Message}{NewLine}{Exception}",
        restrictedToMinimumLevel: LogEventLevel.Error
    );
    
    // カスタムEnricherの追加
    config.Enrich.WithProperty("MachineName", Environment.MachineName);
    config.Enrich.WithProperty("ProcessId", Environment.ProcessId);
});

カスタムLoggerインスタンスの使用

csharp
// 複数のLoggerインスタンスの作成
var webLogger = LogHandler.Create(webLogOptions, false);
var dbLogger = LogHandler.Create(dbLogOptions, false);

// 特定のLoggerインスタンスを使用
LogHelper.Info(webLogger, "Webリクエスト処理完了");
LogHelper.Error(dbLogger, "データベース接続例外", exception);

パフォーマンス最適化

非同期ログフラッシュ

csharp
// 同期フラッシュ(ブロックあり)
LogHelper.FlushAndSave();

// 非同期フラッシュ(ノンブロッキング)
LogHelper.CloseAndFlushAsync();

条件付きログ記録

csharp
// 不要な文字列フォーマットを回避
if (logger.IsEnabled(LogEventLevel.Debug))
{
    LogHelper.Debug("複雑なデバッグ情報: {Data}", ExpensiveOperation());
}

ベストプラクティス

構造化ログ

構造化されたログメッセージを使用し、後続の分析に役立てます:

csharp
// 良い実践 - 構造化ログ
LogHelper.Info("ユーザーログイン成功、ユーザーID: {UserId}, IP: {IP}, 所要時間: {Duration}ms", 
    userId, ipAddress, duration);

// 避けるべき - 文字列連結
LogHelper.Info($"ユーザーログイン成功、ユーザーID: {userId}, IP: {ipAddress}, 所要時間: {duration}ms");

ログレベルの適切な使用

csharp
// Debug - 開発時のデバッグ情報
LogHelper.Debug("ProcessOrder メソッドに入りました。パラメータ: {OrderId}", orderId);

// Info - 重要なビジネスイベント
LogHelper.Info("注文作成成功、注文番号: {OrderId}, ユーザー: {UserId}", orderId, userId);

// Warn - 復旧可能な問題
LogHelper.Warn("データベース接続をリトライ中、{Attempt} 回目の試行", attemptCount);

// Error - 注意が必要なエラー
LogHelper.Error("決済処理失敗、注文: {OrderId}, エラー: {Error}", orderId, error);

// Fatal - アプリケーション終了を引き起こす深刻なエラー
LogHelper.Fatal("データベース接続プール枯渇、アプリケーションを終了します");

タグによる分類

csharp
// 機能モジュール別に分類
LogHelper.Info("ユーザー管理", "ユーザー登録成功: {Email}", email);
LogHelper.Info("注文処理", "注文ステータス更新: {OrderId} -> {Status}", orderId, status);
LogHelper.Info("決済システム", "決済完了: {Amount} 元", amount);

// 環境別に分類
LogHelper.Info("本番環境", "サーバー起動完了");
LogHelper.Debug("開発環境", "デバッグ情報: {Data}", debugData);

例外処理

csharp
try
{
    await ProcessOrderAsync(orderId);
    LogHelper.Info("注文処理", "注文 {OrderId} の処理完了", orderId);
}
catch (BusinessException ex)
{
    // ビジネス例外は警告として記録
    LogHelper.Warn("注文処理", "ビジネスルール検証失敗: {Message}", ex.Message);
    throw;
}
catch (Exception ex)
{
    // システム例外はエラーとして記録
    LogHelper.Error("注文処理", ex);
    throw;
}

設定管理

csharp
// 開発環境の設定
var devLogOptions = new LogOptions("logs")
{
    LogEventLevel = LogEventLevel.Debug,
    IsConsole = true,
    RollingInterval = RollingInterval.Hour
};

// 本番環境の設定
var prodLogOptions = new LogOptions("logs")
{
    LogEventLevel = LogEventLevel.Information,
    IsConsole = false,
    RollingInterval = RollingInterval.Day,
    IsGrafanaLoki = true,
    GrafanaLokiUrl = "http://loki.prod.com:3100"
};

// 環境に応じて設定を選択
var logOptions = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") == "Development" 
    ? devLogOptions 
    : prodLogOptions;

API リファレンス

LogHandler

メソッド説明
LogHandler.Create(LogOptions)指定した設定で Logger インスタンスを作成
LogHandler.Create(LogOptions, bool)Logger インスタンスを作成。第2パラメータはグローバルデフォルトに設定するかどうか
LogHandler.Create(LogOptions, bool, ``Action<LoggerConfiguration>``)Logger インスタンスを作成し、コールバックで Serilog 設定をカスタマイズ

LogHelper ログ記録メソッド

メソッド説明
LogHelper.Verbose(message)Verbose レベルのログを記録
LogHelper.Debug(message)Debug レベルのログを記録
LogHelper.Info(message)Information レベルのログを記録
LogHelper.Warn(message)Warning レベルのログを記録
LogHelper.Error(message)Error レベルのログを記録
LogHelper.Fatal(message)Fatal レベルのログを記録
LogHelper.Info(tag, message, args)タグ付き Info ログ
LogHelper.Warn(tag, message, args)タグ付き Warn ログ
LogHelper.Error(tag, message, args)タグ付き Error ログ
LogHelper.Error(Exception)例外を記録(スタックトレース付き)
LogHelper.Error(tag, Exception)タグ付き例外記録
LogHelper.InfoConsole(message)コンソールにも出力する Info ログ
LogHelper.ErrorConsole(message)コンソールにも出力する Error ログ(赤色)
LogHelper.Console(message)コンソールのみに出力
LogHelper.FlushAndSave()同期フラッシュしてログを保存
LogHelper.CloseAndFlushAsync()非同期でクローズしてフラッシュ

LogOptions 主なプロパティ

プロパティ説明
LogSavePathstringログディレクトリパス
LogTypestringサーバー種別識別子
LogTagNamestringログタグ名
LogEventLevelLogEventLevel最低ログレベル
IsConsoleboolコンソール出力の有無
RollingIntervalRollingIntervalファイルローテーション間隔
FileSizeLimitByteslong単一ログファイルのサイズ制限
RetainedFileCountLimitint保持するログファイル数
IsGrafanaLokiboolGrafana Loki の有効フラグ
GrafanaLokiUrlstringLoki サービスアドレス
GrafanaLokiLabelsDictionary<string, string>Loki ラベル
GrafanaLokiUsernamestringLoki 認証ユーザー名
GrafanaLokiPasswordstringLoki 認証パスワード

依存関係

  • Serilog.AspNetCore (9.0.0) - コアログフレームワーク
  • Serilog.Sinks.Console (6.0.0) - コンソール出力
  • Serilog.Sinks.File (7.0.0) - ファイル出力
  • Serilog.Sinks.Grafana.Loki (8.3.1) - Grafana Loki 統合
  • GameFrameX.Foundation.Json - JSON シリアライズサポート