Използвайте NЛог за регистриране

Дата на създаване на страница :

Околната среда

Визуално студио
  • Изглед от 10 до 2008
ASP.NET ядро
  • 5.0 (Страницата на MVC, Страницата за самобръсначовка)

На първо време

NLog ви позволява да извеждате регистрационни файлове на файлове, имейли и бази данни в зависимост от вашите настройки.

NLog ASP.NET бъде включен в стандартната система за регистриране на ядрото. Възможно е да се извеждат регистрационни файлове според настройките, докато използвате дърваря по подразбиране.

За нивата на лог

Регистрационните файлове на Microsoft и NLogs са разделени на шест етапа и изходните нива са приблизително едни и същи:

Ниво на MicrosoftNЛог
0 Проследи Проследи
1 Отстраняване Отстраняване
2 Информация Информация
3 Предупреждение Предупреждават
4 Грешка Грешка
5 Критични Фатална
(6) Не, не (Изкл.)

Колкото по-високо ниво, толкова по-важно е регистрационният файл и толкова по-вероятно е да се записва независимо от log изход ограничения.

Инструкции за регистриране

Внедряване на NЛог пакет

ASP.NET сте създали основен проект, добавете пакет.

С десния бутон върху Зависимости за вашия проект и изберете Управление на NuGet пакети.

Щракнете върху раздела Преглед и въведете NЛог в полето за търсене, за да се покажат NЛог,свързани пакети.

Изберете NLogи след това щракнете върху бутона инсталиране с най-новата стабилна версия.

Щракнете върху OK.

Също така инсталирайте NLog.Web.AspNet.

Пакетът е добавен към проекта.

Добави 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 са настроени да компилация действие: съдържание, копирай в изходна директория: копирайте ако нов.

Редактиране на приложението

По подразбиране, без значение как сте задали 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": "*"
}

Също така, по време на разработването, приложения. Настройки на развитие.json са заредени, така че ние също ги променяме.

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

Подготовка на програми за NЛог

Добавяне на програма, така че можете да влезете в механизма на 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 のセットアップ
}

Влезете

За MVC HomeComtroller проекти, за страниците на Razor, IndexModel щяхте да бъдете ILogger<IndexModel> logger предадени на конструктора. Той също така е настроен _logger в личното поле, така че можете да го използвате за регистриране.

По-долу е пример за изход от razor страница, но 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("ページを表示するタイミングでログを出力します。");
  }
}

Когато отстраняване на грешки, мисля, че един регистрационен файл може да се направи в папката на проекта.

Можете да проверите регистрационния файл, като разгледате съдържанието на файла.

Comment

Обяснявам го в ред, но не обяснявам по-малко важни неща.

<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})" />

Променливата е настроена на това, в което ще бъде изведено съдържанието на регистрационния файл. Можете да въведете директно в по-късни цели, но ако посочите няколко от едно и също оформление, е по-лесно да ги управлявате в една променлива.

По-добре е да се обърнете към официалния сайт, за да видите какви параметри могат да бъдат посочени в оформлението.

За справка параметрите, посочени тук, са изход в следния формат:

параметър
Изходно съдържание на
дълготрайна дата Дата и време минути като "2021-03-17 11:46:36:36.5034"
свойства на събитие Показва ИД на събитие и др.
Ниво Нива като проследяване и грешка
Съобщение Съобщение, указано в регистрирането на програмата
Изключение Какво става, ако пропуснете изключение при регистрирането на програмата
на 2000 Регистриране на местоположение, име на файл и т.н.

Пример за изход

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} определя главната папка за уеб проекта. Въпреки това, когато работите, е по-добре да изведете регистрационните файлове извън уеб директорията за подмяна на програмата и защита.

Третият е xsi:type="Console" посочен и може да се покаже в конзолата в конзолата ап. ASP.NET Core не е конзола приложение, но може да се използва в среди като Докер и 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 е указано в , така че се появява в visual Studio TraceOutput изход.

Вторият е Microsoft.Hosting.Lifetime изхода на регистрационния файл в writeTo (コンソール) библиотеката. ConsoleLifetime асоциации могат да бъдат проверени в конзоли като Azure и Докер. 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}" />

Използваните тук параметри означават:

Описание на параметрите
архивНомериране Дата създава архивен файл по дата.
архивВсеки Ден се използва за архивиране на дневна база. Има и начини да се уточни "Месец", "Час", "Неделя" и др.
архив Име на файл Път до архива. {#} промени на база архивиране по архив.
АрхивДата на формуляр Формат на датата по дата по дата на името на файла.
максАрхив Файненшъл Задава колко файла да се архивират.

Има и начини за архивиране на не-дата методи. За повече информация вижте официалния сайт.

Когато се изпълнява, изглежда така:

Изпращане на имейли на регистрационен файл

NLog също така ви позволява да изпращате имейли при регистриране. Ако обаче изпратите имейл, като например регистър за отстраняване на грешки, ще стане твърде много за изпращане, Добра идея е да се насочите само ограничени нива на дневник, като грешка и фатален. Освен това, за да се избегне рискът от повреда, като например блокиране на пощенския сървър поради преивъртания на предаване, Препоръчваме ви да зададете имейл акаунт само за регистриране.

По-долу е пример за конфигурация. Ако искате всъщност да изпратите поща, следвайте 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("ページを表示するタイミングでログを出力します。");
}