Χρήση του NLog για καταγραφή

Ημερομηνία δημιουργίας σελίδας :

Περιβάλλον

Οπτικό Στούντιο
  • Οπτικό Στούντιο 2019
ASP.NET Πυρήνας
  • 5.0 (MVC, σελίδα ξυραφιών)

Στην αρχή

Το NLog σάς επιτρέπει να εξάγετε αρχεία καταγραφής σε αρχεία, μηνύματα ηλεκτρονικού ταχυδρομείου και βάσεις δεδομένων ανάλογα με τις ρυθμίσεις σας.

Το NLog ASP.NET ενσωματωθεί στο τυπικό σύστημα καταγραφής του πυρήνα. Είναι δυνατή η έξοδος αρχείων καταγραφής σύμφωνα με τις ρυθμίσεις κατά τη χρήση του προεπιλεγμένου καταγραφέα.

Πληροφορίες για τα επίπεδα καταγραφής

Τα αρχεία καταγραφής της Microsoft και τα NLogs χωρίζονται σε έξι στάδια και τα επίπεδα εξόδου είναι περίπου τα ίδια:

Επίπεδο MicrosoftNLog
0 Ίχνος Ίχνος
1 Εντοπισμού σφαλμάτων Εντοπισμού σφαλμάτων
2 Πληροφορίες Πληροφορίες
3 Προειδοποίηση Προειδοποιούν
4 Σφάλμα Σφάλμα
5 Κρίσιμη Μοιραίο
(6) (Καμία) Δεν είναι η 1η Δεκεμβρίου Δεν θα σε κλείσω.

Όσο υψηλότερο είναι το επίπεδο, τόσο πιο σημαντικό είναι το αρχείο καταγραφής και τόσο πιο πιθανό είναι να γραφτεί ανεξάρτητα από τους περιορισμούς εξόδου του αρχείου καταγραφής.

Οδηγίες καταγραφής

Ανάπτυξη πακέτου NLog

ASP.NET έχετε δημιουργήσει ένα έργο Core, προσθέστε ένα πακέτο.

Κάντε δεξί κλικ στην επιλογή Εξαρτήσεις για το έργο σας και επιλέξτε Διαχείριση πακέτων NuGet.

Κάντε κλικ στην καρτέλα Αναζήτηση και πληκτρολογήστε NLog στο πεδίο αναζήτησης για να εμφανίσετε πακέτα που σχετίζονται με το NLog.

Επιλέξτε NLog και, στη συνέχεια, κάντε κλικ στο κουμπί εγκατάστασης με επιλεγμένη την πιο πρόσφατη σταθερή έκδοση.

Κάντε κλικ στο κουμπί OK.

Επίσης, εγκαταστήστε το NLog.Web.AspNetCore.

Το πακέτο έχει προστεθεί στο έργο.

Προσθήκη nlog.config

Προσθέστε το αρχείο nlog.config, τον ορισμό εξόδου του αρχείου καταγραφής NLog, στο έργο. Τα περιεχόμενα είναι σε μορφή XML, οπότε τα δημιούργησα ως αρχείο XML. Το όνομα αρχείου πρέπει να είναι 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"
      autoReload="true"
      internalLogLevel="Info"
      throwConfigExceptions="true"
      internalLogFile="${basedir}/internal-nlog-AspNetCore.txt">

  <!-- ログの出力レイアウトを変数 layoutDefine で定義 -->
  <variable name="layoutDefine"
            value="${longdate} [${event-properties:item=EventId_Id:whenEmpty=0}][${level:padding=-5}] ${message} ${exception:format=tostring} (${callsite:includeNamespace=false:fileName=true:includeSourcePath=false})" />

  <!-- 書き込むターゲット -->
  <targets>
    <!-- Visual Studio の出力 (デバッグ) に書き込みます -->
    <target xsi:type="Trace" name="TraceOutput" rawWrite="true" layout="${layoutDefine}" />

    <!-- 基本的な詳細を含むすべてのログメッセージのファイルターゲット -->
    <target xsi:type="File" name="FileOutput" fileName="${aspnet-appbasepath}/Log-${shortdate}.log" layout="${layoutDefine}" />

    <!-- Docker / Visual Studio の起動検出を改善するためにライフタイムメッセージをホストするためのコンソールターゲット  -->
    <target xsi:type="Console" name="LifetimeConsole" layout="${level:truncate=4}\: ${logger}[0]${newline}      ${message}${exception:format=tostring}" />
  </targets>

  <!-- ロガー名からターゲットにマップするルール -->
  <rules>
    <!-- Microsoft からのものを含むすべてのログ -->
    <logger name="*" writeTo="TraceOutput" />

    <!-- 起動の検出を高速化するために、ホスティングライフタイムメッセージをコンソールターゲットに出力します。Microsoft.Hosting.Lifetime はここより下の定義には出力しません -->
    <logger name="Microsoft.Hosting.Lifetime" minlevel="Info" writeTo="LifetimeConsole" final="true" />

    <!-- 重要でない Microsoft ログをスキップして、自分のログのみをログに記録する。システムが出す Warning 以上のログ以外はここより下の定義には出力されません -->
    <logger name="Microsoft.*" maxlevel="Info" final="true" />
    <logger name="System.Net.Http.*" maxlevel="Info" final="true" />

    <!-- 上記で除外したもの以外をファイルに出力 -->
    <logger name="*" writeTo="FileOutput" />
  </rules>
</nlog>

Βεβαιωθείτε ότι οι ιδιότητες του nlog.config έχουν οριστεί σε Ενέργεια δόμησης: Περιεχόμενο, Αντιγραφή σε κατάλογο εξόδου: Αντιγραφή εάν είναι νέο.

Επεξεργασία εφαρμογών.json

Από προεπιλογή, ανεξάρτητα από τον τρόπο ορισμού του nlog.config, Information μόνο αυτά τα επίπεδα είναι αποτέλεσμα. Αυτό συμβαίνει επειδή η καταγραφή βασίζεται επίσης στο appsetting.json.

Ανοίξτε το appsetting.json Logging.LogLevel.Default και αλλάξτε την τιμή σε Trace . Εάν χρησιμοποιείτε NLog, μπορείτε να προσαρμόσετε το επίπεδο στην πλευρά NLog, ώστε να μπορείτε να εξάγετε σχεδόν όλα τα επίπεδα Trace ορίζοντας appsetting.json.

{
  "Logging": {
    "LogLevel": {
      "Default": "Trace",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*"
}

Επίσης, κατά τη διάρκεια της ανάπτυξης, appsettings. Οι ρυθμίσεις του Development.json είναι φορτωμένες, οπότε τις αλλάζουμε κι εμείς.

{
  "DetailedErrors": true,
  "Logging": {
    "LogLevel": {
      "Default": "Trace",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  }
}

Προετοιμασία προγραμμάτων για NLog

Προσθέστε ένα πρόγραμμα ώστε να μπορείτε να συνδεθείτε στο μηχανισμό NLog.

Ανοίξτε .cs αρχείο προγράμματος και διορθώστε το ως εξής:

using NLog.Web;  // 追加

// 省略

public class Program
{
  public static void Main(string[] args)
  {
    var logger = NLogBuilder.ConfigureNLog("nlog.config").GetCurrentClassLogger();
    try
    {
      CreateHostBuilder(args).Build().Run();
    }
    catch (Exception exception)
    {
      // NLog:セットアップエラーをキャッチ
      logger.Error(exception, "例外のためにプログラムを停止しました。");
      throw;
    }
    finally
    {
      // アプリケーションを終了する前に、内部タイマー/スレッドをフラッシュして停止するようにしてください
      // (Linux でのセグメンテーション違反を回避してください)
      NLog.LogManager.Shutdown();
    }
  }

  public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
      .ConfigureWebHostDefaults(webBuilder =>
      {
        webBuilder.UseStartup<Startup>();
      })
      .ConfigureLogging(logging =>
      {
        logging.ClearProviders();                 // NLog 以外で設定された Provider の無効化.
        logging.SetMinimumLevel(LogLevel.Trace);  // 最小ログレベルの設定
      })
      .UseNLog();  // NLog:依存性注入のための NLog のセットアップ
}

Καταγραφή

Για έργα HomeComtroller MVC, για σελίδες ξυραφιών, IndexModel θα είχατε περάσει στον ILogger<IndexModel> logger κατασκευαστή. Έχει επίσης οριστεί _logger σε ιδιωτικό πεδίο, ώστε να μπορείτε να το χρησιμοποιήσετε για να συνδεθείτε.

Ακολουθεί ένα παράδειγμα εξόδου από μια σελίδα ξυραφιού, αλλά το MVC μπορεί να παράγει με τον ίδιο κώδικα.

// 省略

public class IndexModel : PageModel
{
  private readonly ILogger<IndexModel> _logger;
  
  public IndexModel(ILogger<IndexModel> logger)
  {
    _logger = logger;
    
    _logger.LogTrace("Trace で出力します。");
    _logger.LogDebug("Debug で出力します。");
    _logger.LogInformation("Information で出力します。");
    _logger.LogWarning("Warning で出力します。");
    _logger.LogError("Error で出力します。");
    _logger.LogCritical("Critical で出力します。");
    
    _logger.LogInformation(1, "EventID ありで出力します。");
  }
  
  public void OnGet()
  {
    _logger.LogInformation("ページを表示するタイミングでログを出力します。");
  }
}

Κατά τον εντοπισμό σφαλμάτων, πιστεύω ότι μπορεί να γίνει ένα αρχείο καταγραφής στο φάκελο του έργου.

Μπορείτε να ελέγξετε το αρχείο καταγραφής εξετάζοντας τα περιεχόμενα του αρχείου.

Δείγμα σχολίου nlog.config

Το εξηγώ με τη σειρά, αλλά δεν εξηγώ τα λιγότερο σημαντικά μέρη.

<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      autoReload="true"
      internalLogLevel="Info"
      throwConfigExceptions="true"
      internalLogFile="${basedir}/internal-nlog-AspNetCore.txt">

Υπάρχουν παράμετροι, όπως οι ρυθμίσεις εξόδου του αρχείου καταγραφής για το ίδιο το NLog.

internalLogFile θα είναι ο προορισμός του αρχείου καταγραφής. Αυτό μπορεί να είναι χρήσιμο, για παράδειγμα, εάν υπάρχει σφάλμα στην έξοδο του ίδιου του αρχείου καταγραφής. ${basedir} αναφέρεται στο φάκελο εκτέλεσης του προγράμματος.

internalLogLevel είναι το επίπεδο εξόδου του αρχείου καταγραφής NLog. Off Εάν είναι, δεν θα είναι καθόλου έξοδος.

<!-- ログの出力レイアウトを変数 layoutDefine で定義 -->
<variable name="layoutDefine"
          value="${longdate} [${event-properties:item=EventId_Id:whenEmpty=0}][${level:padding=-5}] ${message} ${exception:format=tostring} (${callsite:includeNamespace=false:fileName=true:includeSourcePath=false})" />

Η μεταβλητή ορίζεται σε ποια διάταξη θα εξαγάγονται τα περιεχόμενα του αρχείου καταγραφής. Μπορείτε να πληκτρολογήσετε απευθείας σε μεταγενέστερους στόχους, αλλά εάν καθορίσετε πολλά από την ίδια διάταξη, είναι ευκολότερο να τα διαχειριστείτε σε μία μεταβλητή.

Είναι καλύτερα να ανατρέξετε στην επίσημη ιστοσελίδα για να δείτε ποιες παράμετροι μπορούν να καθοριστούν στη διάταξη.

Για αναφορά, οι παράμετροι που καθορίζονται εδώ είναι έξοδος με την ακόλουθη μορφή:

Περιεχόμενο εξόδου παραμέτρων
Η διάρκεια της διάρκειας ζωής του 20 Ημερομηνία και ώρα λεπτών όπως "2021-03-17 11:46:36.5034"
Ιδιότητες συμβάντος Εμφανίζει το αναγνωριστικό συμβάντος κ.λπ.
Επίπεδο Επίπεδα όπως ανίχνευση και σφάλμα
Μήνυμα Μήνυμα που καθορίζεται στην καταγραφή προγραμμάτων
Εξαίρεση Τι γίνεται αν περάσετε την εξαίρεση στην καταγραφή προγραμμάτων
το 2007, το Θέση καταγραφής, όνομα αρχείου κ.λπ.

Παράδειγμα εξόδου

2021-03-17 11:46:37.3537 [0][Info ] ページを表示するタイミングでログを出力します。  (IndexModel.OnGet(Index.cshtml.cs:26))
<!-- 書き込むターゲット -->
<targets>
  <!-- Visual Studio の出力 (デバッグ) に書き込みます -->
  <target xsi:type="Trace" name="TraceOutput" rawWrite="true" layout="${layoutDefine}" />

  <!-- 基本的な詳細を含むすべてのログメッセージのファイルターゲット -->
  <target xsi:type="File" name="FileOutput" fileName="${aspnet-appbasepath}/Log-${shortdate}.log" layout="${layoutDefine}" />

  <!-- Docker / Visual Studio の起動検出を改善するためにライフタイムメッセージをホストするためのコンソールターゲット  -->
  <target xsi:type="Console" name="LifetimeConsole" layout="${level:truncate=4}\: ${logger}[0]${newline}      ${message}${exception:format=tostring}" />
</targets>

Καθορίζει τον προορισμό για έξοδο. Μπορεί να καθοριστεί πολλαπλάσιο.

Το πρώτο xsi:type="Trace" καθορίζει και το αρχείο καταγραφής εκτυπώνεται στο παράθυρο εξόδου του Visual Studio. Μπορεί να χρησιμοποιηθεί κυρίως για τον εντοπισμό σφαλμάτων στην εκτέλεση.

Το δεύτερο xsi:type="File" καθορίζει και καταγράφει ένα αρχείο στην καθορισμένη διαδρομή. Εάν ${shortdate} καθορίσετε στη διαδρομή, μπορείτε να γράψετε το αρχείο καταγραφής στο αρχείο της ημερομηνίας του αρχείου καταγραφής την ώρα του αρχείου καταγραφής. Καθορίζει επίσης ${aspnet-appbasepath} τον ριζικό φάκελο για το έργο Web. Ωστόσο, όταν λειτουργείτε, είναι προτιμότερο να εξάγετε αρχεία καταγραφής εκτός του καταλόγου Web για αντικατάσταση προγράμματος και ασφάλεια.

Το τρίτο xsi:type="Console" καθορίζεται και μπορεί να εμφανιστεί στην κονσόλα στην εφαρμογή κονσόλας. ASP.NET Core δεν είναι εφαρμογή κονσόλας, αλλά μπορεί επίσης να χρησιμοποιηθεί σε περιβάλλοντα όπως το Docker και το Azure, επειδή η κατάσταση μπορεί να εμφανιστεί στην κονσόλα. Αυτή είναι η περιγραφή στην επίσημη ιστοσελίδα του NLog.

<!-- ロガー名からターゲットにマップするルール -->
<rules>
  <!-- Microsoft からのものを含むすべてのログ -->
  <logger name="*" writeTo="TraceOutput" />

  <!-- 起動の検出を高速化するために、ホスティングライフタイムメッセージをコンソールターゲットに出力します。Microsoft.Hosting.Lifetime はここより下の定義には出力しません -->
  <logger name="Microsoft.Hosting.Lifetime" minlevel="Info" writeTo="LifetimeConsole" final="true" />

  <!-- 重要でない Microsoft ログをスキップして、自分のログのみをログに記録する。システムが出す Warning 以上のログ以外はここより下の定義には出力されません -->
  <logger name="Microsoft.*" maxlevel="Info" final="true" />
  <logger name="System.Net.Http.*" maxlevel="Info" final="true" />

  <!-- 上記で除外したもの以外をファイルに出力 -->
  <logger name="*" writeTo="FileOutput" />
</rules>

Εδώ καθορίζετε το επίπεδο και τον τύπο των αρχείων καταγραφής που θα απομειχώνεται στο σημείο όπου. Αυτή η περιγραφή εφαρμόζεται από επάνω προς τα πάνω.

Το πρώτο είναι να name="*" εξαγάγετε όλα τα αρχεία καταγραφής στο στόχο, επειδή το επίπεδο writeTo καθορίζεται κατά τον καθορισμό . Αυτή target είναι η καθορισμένη στο , TraceOutput επομένως εμφανίζεται στην έξοδο του Visual Studio.

Το δεύτερο είναι Microsoft.Hosting.Lifetime η έξοδος στην έξοδο του αρχείου καταγραφής στη writeTo (コンソール) βιβλιοθήκη. Οι συσχετιμοί ConsoleLifetime μπορούν να ελεγχθούν σε κονσόλες όπως το Azure και το Docker. minlevel="Info" Επειδή καθορίζει και Trace Debug δεν καταγράφεται. Επίσης, οι επόμενοι ορισμοί δεν εξάγουν final="true" Microsoft.Hosting.Lifetime σχετικά αρχεία καταγραφής.

Το τρίτο name="Microsoft.*" είναι να name="System.Net.Http.*" διακόψετε την καταγραφή final="true" καθορίζοντας για και αρχεία καταγραφής. name *είναι ένας χαρακτήρας μπαλαντέρ, που σημαίνει Microsoft System.Net.Http ότι αναφέρεται σε όλες τις σχετικές βιβλιοθήκες. , αλλά σταματήστε maxlevel="Info" Trace εδώ, Debug Information επειδή WArningΤο Error αρχείο καταγραφής , το αρχείο καταγραφής είναι επίσης αποτέλεσμα σε Critical επόμενους ορισμούς.

Το τέταρτο είναι η έξοδος σε final="true" ένα αρχείο εκτός από το αρχείο καταγραφής που διακόπηκε παραπάνω.

Αρχεία καταγραφής αρχειοθέτησης

Υπάρχει επίσης μια μέθοδος αρχειοθέτησης του παλιού αρχείου καταγραφής σε ξεχωριστό φάκελο για κάθε ημερομηνία με ένα μόνο κύριο αρχείο καταγραφής.

Για παράδειγμα:

<target xsi:type="File"
        name="FileOutput"
        fileName="${aspnet-appbasepath}/Log.log"
        archiveNumbering="Date"
        archiveEvery="Day"
        archiveFileName="${aspnet-appbasepath}/Archive/Log_{#}.log"
        archiveDateFormat="yyyy-MM-dd"
        maxArchiveFiles="7"
        layout="${layoutDefine}" />

Οι παράμετροι που χρησιμοποιούνται εδώ σημαίνουν:

Περιγραφή παραμέτρου
Αρχειοθήκη Αριθμητική Η ημερομηνία δημιουργεί ένα αρχείο αρχειοθέτησης κατά ημερομηνία.
ΑρχειοθέτησηΕύθυνα Η ημέρα χρησιμοποιείται για την αρχειοθέτηση σε καθημερινή βάση. Υπάρχουν επίσης τρόποι για να καθορίσετε "Μήνας", "Ώρα", "Κυριακή", κλπ.
Αρχειοθήκη Όνομα Διαδρομή για αρχειοθέτηση σε. {#} αλλαγές ανά αρχείο.
ΑρχειοθέτησηDate Μορφάτ Μορφή ημερομηνίας-ημερομηνίας της ημερομηνίας αρχειοθέτησης του ονόματος αρχείου.
Μέγιστος αριθμός αρχείων αρχειοθέτησης Καθορίζει πόσα αρχεία θα αρχειοθετηθούν.

Υπάρχουν επίσης τρόποι αρχειοθέτησης μεθόδων μη ημερομηνίας. Για περισσότερες πληροφορίες, ανατρέξτε στην επίσημη ιστοσελίδα.

Όταν εκτελείται, μοιάζει με αυτό:

Αποστολή μηνυμάτων ηλεκτρονικού ταχυδρομείου ανά αρχείο καταγραφής

Το NLog σας επιτρέπει επίσης να στέλνετε μηνύματα ηλεκτρονικού ταχυδρομείου κατά την καταγραφή. Ωστόσο, εάν στείλετε ένα μήνυμα ηλεκτρονικού ταχυδρομείου, όπως ένα αρχείο καταγραφής εντοπισμού σφαλμάτων, θα γίνει πάρα πολύ για αποστολή, Είναι καλή ιδέα να στοχεύσετε μόνο περιορισμένα επίπεδα καταγραφής, όπως Σφάλμα και Ανεπανόρθωτο. Επιπλέον, για να αποφευχθεί ο κίνδυνος βλάβης, όπως ο αποκλεισμός του διακομιστή αλληλογραφίας λόγω μετάδοσης overs, Συνιστάται να καθορίσετε ένα λογαριασμό ηλεκτρονικού ταχυδρομείου μόνο για αρχεία καταγραφής.

Ακολουθεί ένα παράδειγμα ρύθμισης παραμέτρων. Εάν θέλετε πραγματικά να στείλετε αλληλογραφία, ακολουθήστε το διακομιστή SMTP που θέλετε να χρησιμοποιήσετε.

<targets>
  <target xsi:type="Mail"
          name="SendMail"
          smtpServer="SMTP Server Name"
          smtpPort="25"
          subject="XXXX システムでエラーが発生しました"
          from="aaaa@example.com"
          to="bbbb@example.com"
          enableSsl="False"
          smtpAuthentication="None"
          smtpUserName=""
          smtpPassword=""
          layout="${layoutDefine}"/>
</targets>

<rules>
  <logger name="*" minlevel="Error" writeTo="SendMail" />
</rules>

Εγγραφή αρχείων καταγραφής στη βάση δεδομένων

Το NLog μπορεί επίσης να γράψει αρχεία καταγραφής στη βάση δεδομένων. Το παρακάτω είναι ένα παράδειγμα, οπότε ανατρέξτε στην επίσημη ιστοσελίδα για λεπτομέρειες.

Αυτή η ενότητα περιγράφει τα βήματα για εγγραφή στον SQL Server σε διαφορετικό διακομιστή.

Πρώτα, δημιουργήστε έναν πίνακα για σύνδεση στον SQL Server προορισμού. Επειδή μπορείτε να επιλέξετε την τιμή για εγγραφή, ορίστε αυτό που χρειάζεστε ως αρχείο καταγραφής ως στήλη.

Το ακόλουθο είναι ένα παράδειγμα δημιουργίας πίνακα SQL.

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Log](
  [Id] [int] IDENTITY(1,1) NOT NULL,
  [Application] [nvarchar](50) NOT NULL,
  [Logged] [datetime] NOT NULL,
  [Level] [nvarchar](50) NOT NULL,
  [User] [nvarchar](250) NOT NULL,
  [Message] [nvarchar](max) NOT NULL,
  [Logger] [nvarchar](250) NULL,
  [Callsite] [nvarchar](max) NULL,
  [Exception] [nvarchar](max) NULL,
  CONSTRAINT [PK_dbo.Log] PRIMARY KEY CLUSTERED 
(
  [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

Απαιτείται μια βιβλιοθήκη υπολογιστών-πελατών System.Data.SqlClient βάσης δεδομένων για την επεξεργασία της βάσης δεδομένων. Ας το εγκαταστήσουμε από το NuGet.

Γράφει πληροφορίες βάσης δεδομένων σε appsettings.json. Nlog.config σας επιτρέπει να φορτώσετε τις πληροφορίες στο appsettings.json. Οι ρυθμίσεις είναι αβέβαιες, οπότε ρυθμίστε τις σύμφωνα με την πραγματική βάση δεδομένων. Το όνομα κλειδιού είναι αυθαίρετο, αλλά χρησιμοποιείται από το nlog.config.

{
  "": "省略",

  "NlogConnection": {
    "DbHost": "ServerName\\SQLEXPRESS",
    "Database": "TestDatabase",
    "User": "UserName",
    "Password": "********"
  }
}

Ορίστε το αρχείο nlog.config ως εξής:

<targets>
  <target xsi:type="Database"
          name="DatabaseOutput"
          dbProvider="sqlserver"
          dbHost="${configsetting:name=NlogConnection.DbHost}"
          dbDatabase="${configsetting:name=NlogConnection.Database}"
          dbUserName="${configsetting:name=NlogConnection.User}"
          dbPassword="${configsetting:name=NlogConnection.Password}">
    <commandText>
      insert into dbo.Log (
        Application, Logged, [Level], [User], Message, Logger, CallSite, Exception
      ) values (
        @Application, @Logged, @Level, @User, @Message, @Logger, @Callsite, @Exception
      );
    </commandText>
    <parameter name="@application" layout="XXXX System" />
    <parameter name="@logged" layout="${date}" />
    <parameter name="@level" layout="${level}" />
    <parameter name="@user" layout="${aspnet-user-identity}" />
    <parameter name="@message" layout="${message}" />
    <parameter name="@logger" layout="${logger}" />
    <parameter name="@callSite" layout="${callsite:filename=true}" />
    <parameter name="@exception" layout="${exception:tostring}" />
  </target>
</targets>

<rules>
  <logger name="*" writeTo="DatabaseOutput" />
</rules>

Εάν δεν υπάρχουν σφάλματα για εκτέλεση, θα γραφτεί ως εξής:

Παρεμπιπτόντως.cs σημειώστε ότι η προσπάθεια εγγραφής αρχείων καταγραφής στη βάση δεδομένων σε πρώιμο στάδιο, όπως πριν από την αποτυχία του προγράμματος .cs CreateHostBuilder μεθόδους.

Αποκτήστε καταγραφικά από το RequestServices και καταγράψτε τα

Μπορεί να είναι κουραστικό να προσθέτετε στην κατασκευή κάθε φορά που ILogger δημιουργείτε έναν νέο ελεγκτή ή ένα μοντέλο σελίδας. Εναλλακτικά, RequestServices μπορείτε να πάρετε από .

public void OnGet()
{
  // RequestServices から ILogger を取得する
  var logger = (ILogger<IndexModel>)HttpContext.RequestServices.GetService(typeof(ILogger<IndexModel>));

  logger.LogInformation("ページを表示するタイミングでログを出力します。");
}

Εάν ο καθορισμός του δικού σας ελεγκτή ή μοντέλου σελίδας είναι επίσης δυσκίνητος, μπορείτε να δημιουργήσετε μεθόδους επέκτασης ή βασικές.

public static class AspNetExtention
{
  /// <summary>
  /// ロガーを取得する拡張メソッドです。
  /// </summary>
  public static ILogger<T> GetLogger<T>(this T self) where T : PageModel
    => (ILogger<T>)self.HttpContext.RequestServices.GetService(typeof(ILogger<T>));

  // MVC の場合
  //public static ILogger<T> GetLogger<T>(this T self) where T : Controller
  //  => (ILogger<T>)self.HttpContext.RequestServices.GetService(typeof(ILogger<T>));
}

Χρήση υποθέσεων

public void OnGet()
{
  // RequestServices から ILogger を取得する (this. は必要)
  var logger = this.GetLogger();

  logger.LogInformation("ページを表示するタイミングでログを出力します。");
}