Izmantot NLog, lai pieteiktos
Vides
- Vizuālā studija
-
- Visual Studio 2019
- ASP.NET kodols
-
- 5.0 (MVC, skuvekļa lapa)
Sākumā
NLog ļauj izvadīt žurnālus failos, e-pastos un datu bāzēs atkarībā no iestatījumiem.
NLog ASP.NET tiks iekļauts core standarta reģistrēšanas sistēmā. Izmantojot noklusējuma reģistrētāju, ir iespējams izvadīt žurnālus atbilstoši iestatījumiem.
Par žurnāla līmeņiem
Microsoft žurnāli un NLogs ir sadalīti sešos posmos, un izvades līmeņi ir aptuveni vienādi:
Microsoft | NLog līmenis | |
---|---|---|
0 | Izsekot | Izsekot |
1 | Atkļūdošanas | Atkļūdošanas |
2 | Informāciju | Info |
3 | Brīdinājums | Brīdināt |
4 | Kļūda | Kļūda |
5 | Kritisko | Letālu |
(6) | (Nav) | (Izslēgts) |
Jo augstāks līmenis, jo svarīgāks ir žurnāls, un jo lielāka iespēja, ka tas tiks rakstīts neatkarīgi no žurnāla izvades ierobežojumiem.
Reģistrēšanas instrukcijas
NLog pakotnes izvietošana
ASP.NET esat izveidojis pamatprojektu, pievienojiet pakotni.
Ar peles labo pogu noklikšķiniet uz Sava projekta atkarības un atlasiet Pārvaldīt NuGet pakotnes.
Noklikšķiniet uz cilnes Pārlūkot un meklēšanas laukā ierakstiet NLog, lai parādītu ar NLog saistītās pakotnes.
Atlasiet NLog un pēc tam noklikšķiniet uz instalēšanas pogas ar atlasītu jaunāko stabilo versiju.
Noklikšķiniet uz Labi.
Instalējiet arī NLog.Web.AspNetCore.
Pakete ir pievienota projektam.
Pievienot nlog.config
Pievienojiet projektam Nlog.config, NLog žurnāla izvades definīciju. Saturs ir XML formātā, tāpēc es to izveidoju kā XML failu. Faila nosaukumam jābūt nlog.config (mazajiem burtiem).
Izveidojiet failu šādi: Detalizēti iestatījumi tiks apspriesti vēlāk.
<?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>
Pārliecinieties, vai nlog.config rekvizīti ir iestatīti uz Build Action: Content, Copy to Output Directory: Copy if New.
Appsetting.json rediģēšana
Pēc noklusējuma neatkarīgi no tā, kā iestatāt nlog.config, tikai Information
šie līmeņi ir izvade.
Tas ir tāpēc, ka reģistrēšana ir atkarīga arī no appsetting.json.
Atveriet appsetting.json Logging.LogLevel.Default
un mainiet vērtību uz Trace
.
Ja izmantojat NLog, varat pielāgot līmeni NLog pusē, lai jūs varētu izvadīt praktiski visus līmeņus, Trace
iestatot appsetting.json.
{
"Logging": {
"LogLevel": {
"Default": "Trace",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
Arī izstrādes laikā, aplikācijas. Development.json iestatījumi ir ielādēti, tāpēc mēs arī tos mainām.
{
"DetailedErrors": true,
"Logging": {
"LogLevel": {
"Default": "Trace",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
}
}
Programmu sagatavošana NLog
Pievienojiet programmu, lai varētu pieteikties NLog mehānismā.
Atveriet .cs failu un izlabojiet to šādi:
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 のセットアップ
}
Reģistrēšanas
MVC projektiem HomeComtroller
, Razor lapām, IndexModel
jūs būtu nodots ILogger<IndexModel> logger
konstruktoram.
Tas ir iestatīts _logger
arī privātajā laukā, lai to varētu izmantot, lai pieteiktos.
Tālāk ir piemērs izvadei no Razor lapas, bet MVC var izvadīt ar to pašu kodu.
// 省略
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("ページを表示するタイミングでログを出力します。");
}
}
Atkļūdojot, es domāju, ka projekta mapē var izveidot žurnālfailu.
Jūs varat pārbaudīt žurnālu, apskatot faila saturu.
Komentāra nlog.config paraugs
Es to izskaidroju kārtībā, bet es nepaskaidroju mazāk svarīgās daļas.
<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">
Ir parametri, piemēram, paša NLog žurnāla izvades iestatījumi.
internalLogFile
būs žurnāla galamērķis. Tas var būt noderīgi, piemēram, ja paša žurnāla izvadē ir kļūda. ${basedir}
attiecas uz programmas izpildes mapi.
internalLogLevel
ir NLog žurnāla izvades līmenis. Off
ja tā ir, tā vispār netiks izvadīta.
<!-- ログの出力レイアウトを変数 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})" />
Mainīgais ir iestatīts uz to, kādā izkārtojumā tiks izvadīts žurnāla saturs. Vēlākos mērķos var rakstīt tieši, bet, ja norādāt vairākus no viena izkārtojuma, tos ir vieglāk pārvaldīt vienā mainīgajā.
Labāk ir atsaukties uz oficiālo vietni, lai redzētu, kādus parametrus var norādīt izkārtojumā.
Atsaucei šeit norādītie parametri ir izvade šādā formātā:
Parametru | izvades saturs |
---|---|
ilgs laiks | Datums un laika minūtes, piemēram, "2021-03-17 11:46:36.5034" |
notikuma rekvizīti | Parāda programmas norādītā žurnāla izvades notikuma ID utt. |
Līmenī | Līmeņi , piemēram , izsekošana un kļūdu |
Ziņojumu | Programmas reģistrēšanā norādītais ziņojums |
Izņēmums | Ko darīt, ja programmu reģistrēšanā tiek pieļauts izņēmums |
izsaukumavieta | Reģistrēšanas vieta, faila nosaukums utt. |
Izvades piemērs
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>
Norāda izvades mērķi. Var norādīt vairākus.
Pirmais norāda xsi:type="Trace"
, un žurnāls tiek drukāts Visual Studio izvades logā.
To var izmantot galvenokārt izpildes atkļūdošanai.
Otrais xsi:type="File"
norāda un reģistrē failā norādītajā ceļā.
Ja ${shortdate}
norādāt ceļu, žurnālu žurnāla laikā var ierakstīt žurnāla datuma failā.
Norāda ${aspnet-appbasepath}
arī Web projekta saknes mapi.
Tomēr, darbojoties, labāk ir izvadīt žurnālfailus ārpus Web direktorija programmu aizstāšanai un drošībai.
Trešais ir xsi:type="Console"
norādīts, un to var parādīt konsolē konsoles lietotnē.
ASP.NET Core pati par sevi nav konsoles lietotne, bet to var izmantot arī tādās vidēs kā Docker un Azure, jo stāvokli var parādīt konsolē.
Tas ir apraksts NLog oficiālajā tīmekļa vietnē.
<!-- ロガー名からターゲットにマップするルール -->
<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>
Šeit var norādīt, kādā līmenī un kāda tipa žurnālus izvadīt uz vietu. Šis apraksts tiek lietots no augšas uz augšu.
Pirmais ir izvadīt name="*"
visus žurnālus mērķī, jo norādīšanas writeTo
laikā ir norādīts līmenis .
Šī target
ir norādītā vērtība programmā , tāpēc tā tiek parādīta Visual Studio TraceOutput
izvadē.
Otrais ir Microsoft.Hosting.Lifetime
izvade uz bibliotēkas žurnāla writeTo (コンソール)
izvadi.
ConsoleLifetime asociācijas var pārbaudīt konsolēs, piemēram, Azure un Docker.
minlevel="Info"
, jo Trace
Debug
tas norāda un nav reģistrēts žurnālā.
Arī turpmākās definīcijas neizvada final="true"
Microsoft.Hosting.Lifetime
saistītos žurnālus.
Trešais ir name="Microsoft.*"
pārtraukt name="System.Net.Http.*"
reģistrēšanu, final="true"
norādot un reģistrējot.
name
*ir aizstājējzīme, kas nozīmē, Microsoft
System.Net.Http
ka tā attiecas uz visām saistītajām bibliotēkām.
, bet apstājieties šeit maxlevel="Info"
Trace
, Debug
Information
jo
WArning
Nākamajās Error
definīcijās tiek izvadīts arī logs , Critical
kas atrodas .
Ceturtais ir izvade final="true"
uz failu, kas nav iepriekš apturētais žurnāls.
Arhīva žurnāli
Ir arī metode, kā arhivēt veco žurnālfailu atsevišķā mapē katram datumam ar tikai vienu galveno žurnālfailu.
Piemēram:
<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}" />
Šeit izmantotie parametri nozīmē:
Parametra | apraksts |
---|---|
arhīvsNumurēšana | Datums izveido arhīva failu pēc datuma. |
arhīvsKomēdija | Diena tiek izmantota, lai arhivētu ikdienā. Ir arī veidi, kā norādīt "Mēnesis", "Stunda", "Svētdiena" utt. |
arhīva faila nosaukums | Ceļš uz arhivēšanu. {#} izmaiņas veiktas, izmantojot arhīvu atsevišķi. |
arhivētDateFormat | Faila nosaukuma datuma līdz datumam arhīva datuma formāts. |
maxArchiveFiles (MaxArchiveFiles) | Norāda, līdz kuriem arhivētajiem failiem. |
Ir arī veidi, kā arhivēt nevertēšanas metodes. Lai iegūtu papildinformāciju, skatiet oficiālo tīmekļa vietni.
Izpildot to, tas izskatās šādi:
Sūtīt e-pasta ziņojumus pa žurnāliem
NLog arī ļauj nosūtīt e-pastus, piesakoties. Tomēr, ja nosūtāt e-pasta ziņojumu, piemēram, atkļūdošanas žurnālu, tas kļūs pārāk daudz, lai to nosūtītu, Ieteicams atlasīt tikai ierobežotus žurnāla līmeņus, piemēram, Error un Fatal. Turklāt, lai izvairītos no kļūmju riska, piemēram, pasta servera bloķēšanas overs pārraides dēļ, Ieteicams norādīt tikai žurnālā reģistrētu e-pasta kontu.
Tālāk sniegts konfigurācijas piemērs. Ja vēlaties faktiski nosūtīt pastu, izpildiet SMTP serveri, kuru vēlaties izmantot.
<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>
Žurnālu rakstīšana datu bāzē
NLog var arī rakstīt žurnālus datu bāzē. Tālāk ir sniegts piemērs, tāpēc, lūdzu, skatiet oficiālo tīmekļa vietni, lai iegūtu sīkāku informāciju.
Šajā sadaļā aprakstītas darbības, kas jāveic, lai rakstītu SQL Server citā serverī.
Vispirms izveidojiet tabulu, lai pieteiktos mērķa SQL Server. Tā kā varat izvēlēties ierakstāmo vērtību, definējiet, kas nepieciešams kā žurnāls kā kolonna.
Tālāk sniegts tabulas izveides SQL piemērs.
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
Datu bāzes apstrādei System.Data.SqlClient
ir nepieciešama datu bāzes klientu bibliotēka.
Uzstādīsim to no NuGet.
Raksta datu bāzes informāciju appsettings.json. nlog.config ļauj ielādēt informāciju appsettings.json. Iestatījumi ir varbūtēji, tāpēc, lūdzu, iestatiet tos atbilstoši faktiskajai datu bāzei. Atslēgas nosaukums ir patvaļīgs, bet to izmanto nlog.config.
{
"": "省略",
"NlogConnection": {
"DbHost": "ServerName\\SQLEXPRESS",
"Database": "TestDatabase",
"User": "UserName",
"Password": "********"
}
}
Iestatiet nlog.config šādi:
<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>
Ja nav izpildāmu kļūdu, tas tiks rakstīts šādi:
Starp citu.cs ņemiet vērā, ka mēģinājums rakstīt žurnālus datu bāzē agrīnā stadijā, piemēram, pirms programmas .cs CreateHostBuilder
metodēm, var neizdoties.
Iegūstiet reģistrētājus no RequestServices un reģistrējiet tos
Katru reizi, kad izveidojat jaunu kontrolleri vai lapas modeli, ILogger
konstruktoram var būt garlaicīgi.
Alternatīvi, RequestServices
jūs varat saņemt no .
public void OnGet()
{
// RequestServices から ILogger を取得する
var logger = (ILogger<IndexModel>)HttpContext.RequestServices.GetService(typeof(ILogger<IndexModel>));
logger.LogInformation("ページを表示するタイミングでログを出力します。");
}
Ja arī sava kontroliera vai lapas modeļa norādīšana ir apgrūtinoša, varat izveidot paplašinājuma metodes vai pamatklases.
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>));
}
Izmantot pieteikumus
public void OnGet()
{
// RequestServices から ILogger を取得する (this. は必要)
var logger = this.GetLogger();
logger.LogInformation("ページを表示するタイミングでログを出力します。");
}