ASP.NET Core入門チュートリアル10、ASP.NET Coreログ記録(Nlog)入門


一、前言


1、この教程の主な内容

  • ASP.NET Core+内蔵ログコンポーネント記録コンソールログ
  • ASP.NET Core+Nlogローカルログ
  • を1日単位で記録
  • ASP.NET Core+NlogログをカスタムLoggerNameカテゴリ別に異なるディレクトリ
  • に記録
  • ASP.NET Core+Nlogファイルサイズ別アーカイブローカルログ
  • Nlogプロファイル共通プロファイル説明
  • 2、このチュートリアルの環境情報


    ソフトウェア/環境
    説明
    オペレーティングシステム
    Windows 10
    SDK
    2.1.401
    ASP.NET Core
    2.1.3
    IDE
    Visual Studio Code 1.33.0
    エクスプローラ
    Chrome 73
    VSコードカード
    バージョン#バージョン#
    説明
    C#
    1.18.0
    C#インテリジェントな感知を提供する.NET Coreデバッグ、コンパイルなど
    vscdoe-solution-explorer
    0.3.1
    ソリューションビューの提供
    XML Tools
    2.4.0
    XMLハイライト、フォーマット、XMLツリーなどを提供
    このコードは以下のコードで調整されます.https://github.com/ken-io/asp...

    二、ASP.NET Core内蔵ログコンポーネント使用


    ASP.NET Coreには、コンソールにログを出力できるログコンポーネントが内蔵されています

    1、アプリケーション起動時の構成ログ

    Program.csを変更し、WebHostBuilder構築時にログを構成
    //         
    using Microsoft.Extensions.Logging;
    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup()
                .ConfigureLogging(logging =>
                    {
                        logging.ClearProviders();
                        logging.SetMinimumLevel(LogLevel.Info);
                        logging.AddConsole();
                    });

    コンフィギュレーション・アイテム
    説明
    ClearProviders()
    通常、サードパーティのログ・コンポーネントを導入するときに使用されるログ・プロバイダのパージ
    SetMinimumLevel(LogLevel.Information)
    ログ・レベルをInformationに設定
    AddConsole()
    ログ・プロバイダの追加->コンソール
    ここで設定項目は、主にSetMinimumLevel(LogLevel.Information)です.ログレベルをInformationに設定すると、多くのコンソールのログ出力を減らすことができます.

    2、制御中にログを記録する

    HomeController.csを修正し、構造関数によってILoggerを注入する
    //         
    using Microsoft.Extensions.Logging;
    private readonly ILogger _logger;
    
    public HomeController(ILogger logger)
    {
        this._logger = logger;
    }
    public IActionResult Index()
    {
        _logger.LogInformation("------\r
    index:hello world\r
    ------"); return Content("Hello World ! -ken.io"); } public IActionResult CheckPhone(string phone) { _logger.LogInformation($"------\r
    check phone:{phone}\r
    ------"); var result = true; var message = "pass"; if (string.IsNullOrWhiteSpace(phone)) { result = false; message = "phone number is empty"; _logger.LogError($"------\r
    check phone:{message}\r
    ------"); } else if (phone.Length != 11) { result = false; message = "wrong phone number length"; _logger.LogWarning($"------\r
    check phone:{message}\r
    ------"); } return Json(new { Result = result, Phone = phone, Message = message }); }

    ここで、ログコンテンツに含まれる\r
    エスケープは、コンソール出力時/ファイル書き込み時に改行を表します.ここで\r
    ---を追加するのは、主にログ出力時に、私たちがアクティブに記録したログを迅速に見つけるためです.

    3、検証


    アプリケーションを起動し、localhost:5501にアクセスすると、コンソールがHello Worldを出力していることがわかります.
    localhost:5001/home/checkphoneにアクセスすると、Errorログが表示されます.
    localhost:5001/home/checkphoneにアクセスしますか?phone=000、警告ログが表示されます
    localhost:5001/home/checkphoneにアクセスしますか?phone=166666666666、Infoレベルのログしか見えません

    三、ASP.NET Core+Nlogローカルログの記録


    1.Nlog Packageのインストール


    コンソールでコマンドを使用してNlogパッケージをインストールします.
    //      
    cd Ken.Tutorial.Web
    //      nlog
    dotnet add package NLog.Web.AspNetCore --version 4.8.1

    ここで私がインストールした指定バージョン:4.8.1、バージョン番号を指定しない場合は、デフォルトで最新バージョンがインストールされます.

    2、Nlog導入

    Program.csを変更し、WebHostBuilder構築時にログを構成
    //         
    using NLog.Web;
    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup()
                .ConfigureLogging(logging =>
                    {
                        logging.ClearProviders();
                        logging.SetMinimumLevel(LogLevel.Info);
                        logging.AddConsole();
                    }).UseNLog();//UseNLog

    3、Nlogの配置


    プロジェクトルートディレクトリKen.Tutorial.WebにNlogプロファイルnlog.configを新規作成
    
    
    
        
            
        
    
        
            
        
    
    
    

    Nlogプロファイルは、一般的には主に2つの部分を含み、ノード構成ログはターゲットに書き込まれ、ノード構成はルーティングされたルールに一致する.
    主な構成項目
    ken.ioの説明
    ${basedir}/logs/${level}/${shortdate}.log
    プログラム実行ディレクトリに表示され、ログ・ファイルは日単位で書き込まれます.
    ${longdate}|${level:uppercase=true}|${logger}|${message}
    ログコンテンツフォーマット:時間+ログレベル+LoggerName+ログコンテンツ
    任意のレベル、任意のLoggerNameのログをtarget:defaultlogに書き込むことをサポート
    プログラム実行時にプロファイルを読み取ることができるように、Ken.Tutorial.Web.csprojファイルを修正し、binフォルダに実行ファイルを生成する際にもnlog.configをコピーする必要があります.ツールバーでエクスプローラビューに切り替え、ファイルをダブルクリックして変更します.
    
        
    

    4、Nlogテスト


    次のリンクにアクセスするアプリケーションを起動します.
  • localhost:5001/home/checkphone
  • localhost:5001/home/checkphone?phone=000
  • localhost:5001/home/checkphone?phone=16666666666

  • 次に、エクスプローラビューでbin/Debugディレクトリを表示すると、ログがプロファイルのフォーマットで対応するログディレクトリおよびファイルを生成していることがわかります.
    また、nlog.configは、以前の構成に従ってプログラム実行ディレクトリにコピーされていることもわかります.
  • Infoレベルログ
  • Warnレベルログ
  • Errorレベルログ
  • ここでInfoログは比較的多く,rulesを構成することでプログラム自体がアクティブに記録したログのみを出力できる.

    四、Nlog使用進級


    1、カスタムLoggerNameでログをまとめる


    Nlog構成を追加し、LoggerNameに従ってディレクトリを作成
    
    
    
    
    HomeControllerにテスト帰納ログのアクションを追加
    public IActionResult TestLog()
    {
        var logger = NLog.LogManager.GetLogger("testlog");
        logger.Trace("  Trace  ");
        logger.Debug("  Debug  ");
        logger.Info("  Info  ");
        logger.Warn("      ");
        logger.Error("      ");
        return Content("ok");
    }

    ここではNLog.LogManager.GetLoggerによってLoggerが直接作成され、内蔵ログMicrosoft.Extensions.Logging.ILoggerのインスタンスは使用されていないため、LoggerNameをカスタマイズすることができ、また、アプリケーション起動時に構成された最低ログレベルなどもこの方式には有効ではなく、Trace、Debugレベルの別のログを出力することができる.
    アプリケーションを起動し、アクセス:localhost:5001/home/testlog.logsフォルダの下でLoggerNameによって生成されたログ・ディレクトリをリソース・マネージャ・インタフェースに表示し、ログ・レベルに応じて異なるログ・ファイルを生成します.

    2、ログファイルのサイズによってログをアーカイブする


    Nlog構成を追加し、ログ・ファイル・サイズに従ってアーカイブ
    
        

    ここでは、ログファイルのサイズが約1 mbを超える場合にアーカイブ(ここでは1 kbの代わりに1000 bをサボる)し、最大100個のログファイルをアーカイブし、アーカイブログファイルが100個を超えると最も早くアーカイブしたログを削除するように構成します.
    排他的ルールの定義:

    テストアーカイブログのアクションをHomeControllerに追加
    public IActionResult TestLogMany()
    {
        var logger = NLog.LogManager.GetLogger("logmany");
        for (int i = 0; i <= 30000; i++)
        {
            logger.Info("ASP.NET Core    ,       ,  NLog       ,ken   (https://ken.io)");
        }
        return Content("ok");
    }

    ここではテストを容易にするためにforループを直接用いて30000回連続してログに書き込む
    アプリケーションを起動して、アクセス:localhost:5001/home/testlogmanyを起動し、logs/logmanyフォルダの下でファイルサイズでアーカイブされたログをリソースマネージャインタフェースで表示できます.

    五、備考


    1、Nlog常用配置項目説明


    targetノード/プロパティ
    ken.ioの説明
    target
    書き込みタイプ、書き込みテンプレート、ファイル名などを設定できるログ書き込みターゲット
    name
    TargetName,rulesノードで一意に参照する必要がある
    xsi:type
    ターゲットタイプ、サポートファイル(File)、データベース(Database)、メール(Mail)
    keepFileOpen
    パフォーマンスを向上させるため、ログに書き込むたびにファイルを開いたり閉じたりする必要はありません.デフォルトはfalseです.
    encoding
    ファイルコード、ここではutf-8
    fileName
    テンプレート構文/変数をサポートするログファイル名、ログのフルパスとファイル名を含む
    archiveFileName
    テンプレート構文/変数をサポートする、ログのフルパスとファイル名を含むアーカイブログファイル名
    archiveNumbering
    アーカイブ順序方式
    maxArchiveFiles
    最大アーカイブ・ログ・ファイル数
    layout
    ログコンテンツテンプレートには、いくつかの構文/変数が組み込まれています.
    テンプレート構文/変数
    ken.ioの説明
    ${basedir}
    プログラムの現在の実行ディレクトリ
    ${level}
    ログ・レベル
    ${shortdate}
    現在の日付(例:2019-04-05
    ${longdate}
    現在の時間は、ミリ秒まで正確です.たとえば、2019-04-05 14:10:22.4372
    ${uppercase:${level}}
    内容を大文字にフォーマットする
    ${logger}
    LoggerName、ログレコーダ名、通常はLoggerが初期化したクラスの完全な名前、例えばKen.Tutorial.Web.Controllers.HomeController
    ${machinename}
    マシン名
    ${message}
    ログの内容
    rulesノード/プロパティ
    ken.ioの説明
    logger
    ログレコーダルーティング規則構成
    name
    LoggerNameは、完全な一致とあいまいな一致をサポートします.たとえば、mylog、Ken.*
    minlevel
    最小ログ・レベル
    maxlevel
    最大ログ・レベル
    level
    単一のログ・レベルの制限
    levels
    1つ以上のログ・レベル、使用、間隔の指定
    writeTo
    1つ以上のtargetを指定し、使用、間隔
    final
    このルールに一致した後、後続のルールは一致しません.デフォルト:false
    enabled
    このルールを有効にするかどうか、デフォルト:true

    2、付録

  • 本明細書のコード例
  • https://github.com/ken-io/asp...
  • 本明細書では
  • を参照
    https://docs.microsoft.com/zh...
    https://github.com/NLog/NLog....
    https://github.com/nlog/NLog/...
    この記事の後、私の独立ブログに先発しました.https://ken.io/note/asp.net-c...