Použitie NLog na prihlásenie
Životné prostredie
- Vizuálne štúdio
-
- Visual Studio 2019
- ASP.NET jadro
-
- 5.0 (MVC, Britva stránka)
Najprv
NLog umožňuje výstup protokolov do súborov, e-mailov a databáz v závislosti od vašich nastavení.
NLog ASP.NET byť začlenený do štandardného systému zapisovania do denníka jadra. Protokoly je možné výstupovať podľa nastavení pri použití predvoleného záznamníka.
Informácie o úrovniach denníka
Denníky spoločnosti Microsoft a NLogs sú rozdelené do šiestich etáp a výstupné úrovne sú zhruba rovnaké:
Úroveň | Microsoft | NLog |
---|---|---|
0 | Stopových | Stopových |
1 | Ladenie | Ladenie |
2 | Informácie | Info |
3 | Upozornenie | Varovať |
4 | Chyba | Chyba |
5 | Kritické | Fatálne |
(6) | (Žiadne) | (Vypnuté) |
Čím vyššia je úroveň, tým dôležitejší je denník a tým je pravdepodobnejšie, že sa zapíše bez ohľadu na obmedzenia výstupu denníka.
Pokyny na zapisovanie do denníka
Nasadenie balíka NLog
ASP.NET ste vytvorili základný projekt, pridajte balík.
Kliknite pravým tlačidlom myši na položku Závislosti pre projekt a vyberte položku Spravovať balíky NuGet.
Kliknite na tlačidlo Prehľadávať kartu a zadajte NLog do vyhľadávacieho poľa zobraziť NLog-súvisiace balíky.
Vyberte NLog, a potom kliknite na tlačidlo inštalovať s najnovšou stabilnou verziou vybratá.
Kliknite na tlačidlo OK.
Nainštalujte tiež NLog.Web.AspNetCore.
Balík bol pridaný do projektu.
Pridať nlog.config
Pridať nlog.config, výstupná definícia denníka NLog, do projektu. Obsah je vo formáte XML, takže som ho vytvoril ako súbor XML. Názov súboru by mal byť nlog.config (malé písmená).
Vytvorte súbor nasledovne: Podrobné nastavenia budú prediskutované neskôr.
<?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>
Uistite sa, že vlastnosti nlog.config sú nastavené na stavať akcie: obsah, kopírovať do výstupného adresára: Kopírovať, ak je nový.
Upraviť appsetting.json
V predvolenom nastavení, bez ohľadu na to, ako nastavíte nlog.config, Information
len tieto úrovne sú výstup.
Je to preto, že zapisovanie do denníka sa tiež spolieha na appsetting.json.
Otvorte súbor appsetting.json Logging.LogLevel.Default
a zmeňte hodnotu na Trace
.
Ak používate NLog, môžete upraviť úroveň na strane NLog, takže môžete výstup prakticky všetky úrovne Trace
nastavením appsetting.json.
{
"Logging": {
"LogLevel": {
"Default": "Trace",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
Tiež, počas vývoja, znepokoiky. Nastavenia Development.json sú načítané, takže ich tiež meníme.
{
"DetailedErrors": true,
"Logging": {
"LogLevel": {
"Default": "Trace",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
}
}
Pripravujú sa programy pre NLog
Pridajte program, aby ste sa mohli prihlásiť do mechanizmu NLog.
Otvorte .cs programový súbor a opravte ho nasledovne:
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 のセットアップ
}
Zapisovanie do denníka
V prípade projektov MVC HomeComtroller
by ste pre stránky Razor boli IndexModel
odovzdaní ILogger<IndexModel> logger
konštruktérovi.
Je tiež nastavená _logger
v súkromnom poli, takže ju môžete použiť na prihlásenie.
Nasleduje príklad výstupu zo stránky Razor, ale MVC môže výstup s rovnakým kódom.
// 省略
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("ページを表示するタイミングでログを出力します。");
}
}
Pri ladení si myslím, že súbor denníka môže byť vyrobený v priečinku projektu.
Denník môžete skontrolovať tak, že sa pozriete na obsah súboru.
Ukážkový komentár nlog.config
Vysvetľujem to v poriadku, ale nevysvetľujem menej dôležité časti.
<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">
Existujú parametre, ako napríklad nastavenie výstupu denníka pre NLog sám.
internalLogFile
bude cieľom denníka. Môže to byť užitočné, napríklad ak sa vyskytne chyba vo výstupe samotného denníka. ${basedir}
odkazuje na priečinok vykonávania programu.
internalLogLevel
je výstupná úroveň denníka NLog. Off
ak áno, nebude to vôbec výstup.
<!-- ログの出力レイアウトを変数 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})" />
Premenná je nastavená na rozloženie, v akom rozložení bude výstup obsahu denníka. Môžete zadať priamo do neskorších cieľov, ale ak zadáte viacero rovnakých rozložení, je jednoduchšie ich spravovať v jednej premennej.
Je lepšie sa obrátiť na oficiálnu webovú stránku, aby ste zistili, aké parametre môžu byť špecifikované v rozložení.
Pre referenciu, parametre špecifikované tu sú výstup v nasledujúcom formáte:
Obsah výstupu | parametra |
---|---|
dlhý deň | Dátum a čas minút, ako napríklad "2021-03-17 11:46:36.5034" |
vlastnosti udalostí | Zobrazí identifikáciu udalosti atď. |
Úrovni | Úrovne ako sledovanie a chyba |
Správu | Správa zadaná v zapisovaní do denníka programu |
Výnimkou | Čo ak prejdete výnimkou v zapisovaní do denníka programu |
volať | Umiestnenie zapisovania do denníka, názov súboru atď. |
Príklad výstupu
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>
Určuje cieľ výstupu. Je možné zadáť viacero.
Prvý určuje xsi:type="Trace"
, a denník sa vytlačí vo výstupnom okne Visual Studio.
Môže sa použiť predovšetkým na ladenie vykonávania.
Druhý určuje xsi:type="File"
a zaehlási do súboru v zadanej ceste.
Ak ${shortdate}
zadáte v ceste, môžete zapísať denník do súboru dátumu denníka v čase denníka.
Určuje ${aspnet-appbasepath}
aj koreňový priečinok pre webový projekt.
Avšak, pri prevádzke, je lepšie výstup súborov denníka mimo webového adresára pre nahradenie programu a zabezpečenie.
Tretí je zadaný xsi:type="Console"
a môže sa zobraziť v konzole v aplikácii konzoly.
ASP.NET Core nie je konzolová aplikácia, ale môže sa používať aj v prostrediach ako Docker a Azure, pretože stav sa môže zobraziť v konzole.
Toto je popis na oficiálnej webovej stránke 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>
Tu určíte, na akej úrovni a aký typ denníkov sa má výstup na miesto. Tento popis sa používa zhora hore.
Prvým je výstup name="*"
všetkých denníkov do cieľa, pretože úroveň je zadaná writeTo
pri zadání .
Toto target
je zadané v , takže sa zobrazí vo TraceOutput
výstupe Visual Studio.
Druhý je Microsoft.Hosting.Lifetime
výstup na výstup denníka v writeTo (コンソール)
knižnici.
Priradenia ConsoleLifetime je možné skontrolovať v konzolách, ako sú Azure a Docker.
minlevel="Info"
pretože určuje Trace
Debug
, a nie je prihlásený.
Tiež následné definície nevydá súvisiace final="true"
Microsoft.Hosting.Lifetime
denníky.
Tretím je name="Microsoft.*"
zastaviť name="System.Net.Http.*"
zapisovanie final="true"
do denníka zadaním pre a denníky.
name
*je zástupný znak, Microsoft
System.Net.Http
čo znamená, že odkazuje na všetky súvisiace knižnice.
, ale zastavte sa maxlevel="Info"
Trace
Debug
Information
tu, pretože
WArning
Denník Error
, je tiež výstupom v nasledujúcich Critical
definíciách.
Štvrtý je výstup do final="true"
iného súboru ako denník zastavil vyššie.
Archivovať denníky
Existuje tiež metóda archivácie starého súboru denníka v samostatnom priečinku pre každý dátum s iba jedným hlavným súborom denníka.
Napríklad:
<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}" />
Tu použité parametre znamenajú:
Popis | parametra |
---|---|
archiveNumbering (Číslovanie) | Dátum vytvorí archívny súbor podľa dátumu. |
archívVšetka | Deň sa používa na každodennú archiváciu. Existujú aj spôsoby, ako zadať "Mesiac", "Hodina", "Nedeľa" atď. |
názov archiveFileName | Cesta k archivácie. {#} sa mení podľa archivácie. |
ArchivovaťDateFormat | Formát dátumu archivácie názvu súboru podľa dátumu. |
maxArchiveFiles (MaxArchiveFiles) | Určuje, do koľkých súborov sa má archivovať. |
Existujú aj spôsoby archivácie neštatútnych metód. Ďalšie informácie nájdete na oficiálnej webovej lokalite.
Po vykonaní to vyzerá takto:
Odosielanie e-mailov podľa denníka
NLog tiež umožňuje posielať e-maily pri zapisovaní do denníka. Ak však odošlete e-mail, napríklad denník ladenia, bude príliš veľa na odoslanie, Je vhodné zamerať sa len na obmedzené úrovne denníka, ako napríklad Chyba a Fatálne. Okrem toho, aby sa zabránilo riziku zlyhania, ako je blokovanie poštového servera v dôsledku nadmerného prenosu, Odporúčame zadať e-mailové konto iba na denník.
Nasleduje príklad konfigurácie. Ak chcete skutočne odoslať poštu, postupujte podľa servera SMTP, ktorý chcete použiť.
<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>
Zapísať denníky do databázy
NLog môžete tiež zapisovať denníky do databázy. Nasleduje príklad, preto si podrobnosti nájdete na oficiálnej webovej stránke.
Táto časť popisuje kroky na zápis na server SQL Server na inom serveri.
Najprv vytvorte tabuľku pre prihlásenie do cieľového servera SQL Server. Keďže môžete vybrať hodnotu na zápis, definujte, čo potrebujete ako denník ako stĺpec.
Nasleduje príklad vytvorenia tabuľky 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
Na spracovanie databázy sa System.Data.SqlClient
vyžaduje knižnica databázových klientov.
Nainštalume ho z NuGet.
Zapíše informácie o databáze do súboru appsettings.json. nlog.config vám umožňuje načítať informácie v appsettings.json. Nastavenia sú nezáväzné, preto ich nastavte podľa aktuálnej databázy. Názov kľúča je ľubovoľný, ale používa ho súbor nlog.config.
{
"": "省略",
"NlogConnection": {
"DbHost": "ServerName\\SQLEXPRESS",
"Database": "TestDatabase",
"User": "UserName",
"Password": "********"
}
}
Nastaviť nlog.config takto:
<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>
Ak nie sú žiadne chyby na spustenie, bude napísaný nasledovne:
Mimochodom.cs, že pokus o zápis denníkov do databázy v počiatočnom štádiu, napríklad pred program .cs CreateHostBuilder
metódy, môže zlyhať.
Získajte záznamníkov z RequestServices a prihláste ich
Pridanie do konštruktora môže byť únavné pri každom vytvorení ILogger
nového ovládača alebo modelu stránky.
Prípadne môžete RequestServices
získať z .
public void OnGet()
{
// RequestServices から ILogger を取得する
var logger = (ILogger<IndexModel>)HttpContext.RequestServices.GetService(typeof(ILogger<IndexModel>));
logger.LogInformation("ページを表示するタイミングでログを出力します。");
}
Ak je zadanie vlastného ovládača alebo modelu stránky tiež ťažkopádne, môžete vytvoriť metódy rozšírenia alebo základné triedy.
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>));
}
Použitie prípadov
public void OnGet()
{
// RequestServices から ILogger を取得する (this. は必要)
var logger = this.GetLogger();
logger.LogInformation("ページを表示するタイミングでログを出力します。");
}