ASP . NETでログイン.Seriogを使用しているネットコア5


Serilog 最も有名なログライブラリの一つです.NETアプリケーション.につきNuGet , このライブラリの総ダウンロードはすでに明確にこのライブラリの人気を示して175メートルを越えた.NET開発者.これは簡単に設定し、強力な機能の膨大なコレクションを提供します.それは別の間に移植可能です.NETプラットフォームでも、クリーンAPIを提供します.これには、開発者が自分のカスタムコードをプラグインし、さらにこのクールなライブラリの機能を拡張できるように多くの拡張ポイントがあります.このチュートリアルでは、このライブラリを設定する方法を示します.私はまた、テキストとJSON形式で出力をログ出力する方法をカバーし、このチュートリアルの最後に、テキストベースのログファイルにメッセージをログ出力する方法を示します.
あなたがよく知らないならば、...NET組み込みのログフレームワークを構築することができますStep by Step Guide To Logging in ASP.NET Core 5

Serilogとは


Serilog の構造ログライブラリです.アプリケーションにいくつかのクールな診断機能を追加するために使用できるネットアプリケーション.このライブラリは、利用できない新しいログに関連する機能の膨大なコレクションを提供します.NET組み込みのロギングフレームワーク.これは、開発者は、ファイルを含むさまざまな目的地の数百人に、コンソール、オンプレイス、および雲ベースのログサーバー、データベース、およびメッセージキューをログメッセージをログに記録することができます.また、プレーンテキストとJSON形式でログ出力を生成するのネイティブサポートしています.これは、リッチな統合をサポートします.ネットコアASP.NET Core . あなたが利用可能な機能の完全なリストを読むことができますhere .

Structured Logging

Structured logging is the practice of implementing a consistent, predetermined message format for application logs that allows them to be treated as data sets rather than text. The idea of structured logging is to take an application log that is delivered as a string of text and convert it into a simple relational data set that can be more easily searched and analyzed.

source: DevOps Glossary by sumo logic


Serilogシンクの導入


Serilogシンクは、ログイベントを様々な形式に書き込むためのパッケージです.が開発し、大きなserilogコミュニティによってサポートされてシンクの長いリストがあります.人気のあるシンクのいくつかは次のとおりです.

  • Serilog.Sinks.Console – ログ出力をWindowsコンソールまたはANSI端末に標準出力で書き込むには

  • Serilog.Sinks.File – ログイベントを一つ以上のテキストファイルに書き込むには

  • Serilog.Sinks.Email – SMTPメールでログイベントを送信するには

  • Serilog.Sinks.MSSqlServer – ログイベントをマイクロソフトSQL Serverに書き込むには
  • 利用可能なシンクのリストは巨大であり、すべての利用可能なシンクをチェックすることができますhere .

    始める


    プロジェクトの「サービス」フォルダを作成し、サービスフォルダ内に次のImServiceインターフェイスを追加します.
    public interface IMathService
    {
        decimal Divide(decimal a, decimal b);
    }
    
    次に、同じサービスフォルダにMatchServiceクラスを追加し、このクラスでImAsServiceメソッドを実装します.クラスがDeviceMethodの定義を提供するだけでなく、いくつかの基本的なロギングとエラー処理ステートメントを持っていることがわかります.
    あなたがよく知らないならば、...ネット内蔵のログを作成するには、ステップガイドで私のステップを読むことができます.網検層A Step by Step Guide to Logging in ASP.NET Core 5
    public class MathService : IMathService
    {
        private readonly ILogger<MathService> _logger;
    
        public MathService(ILogger<MathService> logger)
        {
            _logger = logger;
        }
    
        public decimal Divide(decimal a, decimal b)
        {
            _logger.LogInformation("Parameter 1: " + a);
            _logger.LogInformation("Parameter 2: " + b);
    
            decimal result = 0;
    
            try
            {
                result = a / b;
            }
            catch (DivideByZeroException ex)
            {
                _logger.LogWarning(ex, "You cannot divide by zero.");
                throw ex;
            }
    
            return result;
        }
    }
    
    次に、サービスを登録する必要があります.NETコア内蔵DIコンテナ.あなたがASPに慣れていないならば.NETコア依存性注入Step by Step Guide to ASP.NET Core Dependency Injection .
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllersWithViews();
    
        services.AddTransient<IMathService, MathService>();
    }
    
    最後に、私はホームサービスとiLoggerを私のhomontrotrollerに注入し、2つの10進法パラメータで除算法を呼び出します.
    public class HomeController : Controller
    {
        private readonly ILogger<HomeController> _logger;
        private readonly IMathService _mathService;
    
        public HomeController(ILogger<HomeController> logger, IMathService mathService)
        {
            _logger = logger;
            _mathService = mathService;
        }
    
        public IActionResult Index()
        {
            try
            {
                decimal result = _mathService.Divide(5, 0);
            }
            catch (DivideByZeroException ex)
            {
                _logger.LogWarning(ex, "An exception occured while dividing two numbers");
            }
    
            return View();
        }
    }
    
    任意の10進数を0に分けることができないので、homecontrollerのインデックス動作を実行すると、例外がスローされ、適切なメッセージがMathServiceとHomeControllerの両方から記録されることがわかります.
    AspNetCore5LoggingDemo.Services.MathService: Information: Parameter 1: 5
    AspNetCore5LoggingDemo.Services.MathService: Information: Parameter 2: 0
    …
    AspNetCore5LoggingDemo.Services.MathService: Warning: You cannot divide by zero.
    …
    AspNetCore5LoggingDemo.Controllers.HomeController: Warning: An exception occured while dividing two numbers
    

    ASP . NETでSerilogを設定する。ネットコア


    これまで、私は基本を使用していた.NETログ記録インフラストラクチャ.SerilogをダウンロードしてインストールすることができますNuGet パッケージと私はASPでSerilogを使用します.このチュートリアルでは、ネットコアアプリケーションもインストールしますSerilog.AspNetCore パッケージ.私もインストールしますSerilog.Sinks.File 後でこのチュートリアルでファイルにイベントを記録する方法を示したいので、NuGetからシンクしてください.Visual Studioで入手可能なNugetパッケージマネージャーを使用してこれらのパッケージのすべてをダウンロードしてインストールできます.

    まず最初に必要なのは組み込みを削除することです.AppSettingsからのネットログ設定.JSONファイル.これは、Serilogがログを構成するために単純なC経線APIを使用しているためです.あなたがまだ外部appsettingsを使いたいならば.あなたがダウンロードして使用する必要がありますSerilog.Settings.AppSettings (. NET Framework )またはSerilog.Settings.Configuration (. NETコア)パッケージ.今のところ、私はCラセンコードを使用してserilogを設定しますので、プロジェクトappSettingsから次の「ログ」セクションでコメントします.JSONファイル.
    {
      //"Logging": {
      //  "LogLevel": {
      //    "Default": "Warning",
      //    "Microsoft": "Warning",
      //    "Microsoft.Hosting.Lifetime": "Information"
      //  }
      //},
    
      "AllowedHosts": "\*"
    }
    
    次に、loggerConfigurationクラスを使用してSerilog Loggerを作成する必要があります.これを行う最も簡単な方法はSerilogのグローバルで静的にアクセスできるロガー“log . logger”を使用することです.プログラムを開きます.以下のコードスニペットに表示されているように、ファイルを作成し、serilogのロガーを構成します.また、CreateHostBuilderメソッドの汎用ホストにuseserilogを追加する必要があります.
    public class Program
    {
        public static void Main(string[] args)
        {
            Log.Logger = new LoggerConfiguration()
                .MinimumLevel.Information()
                .WriteTo.Debug()
                .CreateLogger();
    
            try
            {
                Log.Information("Starting Web Host");
                CreateHostBuilder(args).Build().Run();
            }
            catch (Exception ex)
            {
                Log.Fatal(ex, "Host terminated unexpectedly");
            }
            finally
            {
                Log.CloseAndFlush();
            }
        }
    
        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .UseSerilog()
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });
    }
    
    これは、ASP . NETでSerilogを設定する必要があるすべてです.NETコアプロジェクト.コントローラ、サービス、またはアプリケーションコードを変更する必要はありません.プロジェクトを実行すると、「デバッグ」ウィンドウに次のログメッセージが表示されます.
    [13:06:51 INF] Starting Web Host
    …
    [13:09:37 INF] Parameter 1: 5
    [13:09:37 INF] Parameter 2: 0
    …
    [13:09:37 WRN] You cannot divide by zero.
    …
    [13:09:37 WRN] An exception occured while dividing two numbers
    

    出力の出力


    コンソール、デバッグ、ファイルなどの一般的なシンクのいくつかには、JSONフォーマットの出力のネイティブなサポートがあります.また、Serilogを含めてこのサポートを追加することもできます.書式設定.コンパクトパッケージ.JSON形式でログメッセージを書き込むには、次のコードスニペットに示すように、CompactJsonFormatterまたはCount - RenderedCompactJSOonFormatterをシンク構成メソッドに渡すことができます.
    Log.Logger = new LoggerConfiguration()
        .MinimumLevel.Information()
        .WriteTo.Debug(new RenderedCompactJsonFormatter())
        .CreateLogger();
    
    プロジェクトをもう一度実行し、今度はログメッセージや例外がすべてJSON形式で記録されていることに気づくでしょう.
    {
       "@t":"2020-12-22T08:14:21.7606275Z",
       "@m":"Parameter 1: 5",
       "@i":"aeda7d94",
       "SourceContext":"AspNetCore5LoggingDemo.Services.MathService",
       "ActionId":"bc37216c-cc3d-4a71-b99d-e9b9b350de98",
       "ActionName":"AspNetCore5LoggingDemo.Controllers.HomeController.Index (AspNetCore5LoggingDemo)",
       "RequestId":"8000008c-0002-f700-b63f-84710c7967bb",
       "RequestPath":"/AspNetCore5LoggingDemo"
    }
    

    ファイルへのメッセージの記録


    また、使用するファイルにメッセージをログ出力できますSerilog.Sinks.File パッケージ.あなたがディスク領域を埋めることによって他のアプリをダウンさせないことを確認するために、デフォルトのファイルサイズ制限は1 GBに設定されます.一度の制限に達すると、それ以上のイベントは、次のロールポイントまで書き込まれます.ローリングポリシーを設定する方法は異なります.たとえば、時間、日、または他のピリオド1つのログファイルを作成する場合は、次のようにロール間隔を指定できます.
    Log.Logger = new LoggerConfiguration()
        .MinimumLevel.Information()
        .WriteTo.Debug(new RenderedCompactJsonFormatter())
        .WriteTo.File("logs.txt", rollingInterval: RollingInterval.Day)
        .CreateLogger();
    
    プロジェクトを実行すると、今日の日付のログファイルがファイル名に追加されます.txtが生成されます.

    概要


    Serilogは巨大なライブラリであり、我々は簡単にすべての機能をカバーするために本を書くことができます.あなたが前にSerilogを使用しなかったならば、私はあなたにあなたの診断に関連した必要条件の全てのためにあなたのプロジェクトでそれを使用し始めることを勧めます.