Naplózás az NLog segítségével
Környezet
- Visual Stúdió
-
- Visual Studio 2019
- ASP.NET mag
-
- 5.0 (MVC, Razor oldal)
Először
Az NLog lehetővé teszi, hogy a beállításoktól függően naplókat küldjön fájlokba, e-mailekbe és adatbázisokba.
Az NLog ASP.NET beépíthető a Core szabványos naplózási rendszerébe. Az alapértelmezett naplózó használata közben a beállításoknak megfelelően lehetőség van naplók kimenő kimenőire.
A naplószintek – a
A Microsoft naplók és NLogs vannak osztva hat szakaszban, és a kimeneti szintek nagyjából ugyanaz:
Szint | Microsoft | NLog |
---|---|---|
0 | Nyomkövetési | Nyomkövetési |
1 | Debug | Debug |
2 | Információ | Info |
3 | Figyelmeztetés | Figyelmeztet |
4 | Hiba | Hiba |
5 | Kritikus | Végzetes |
(6) | (Nem) | (Ki) |
Minél magasabb a szint, annál fontosabb a napló, és annál valószínűbb, hogy meg kell írni, függetlenül a napló kimeneti korlátaitól.
Naplózási utasítások
NLog csomag telepítése
ASP.NET, hogy létrehozott egy Core projektet, adjon hozzá egy csomagot.
Kattintson a jobb gombbal a projekt függőségek parancsra, és válassza a NuGet-csomagok kezelése lehetőséget.
Kattintson a Tallózás fülre, és írja be az NLog parancsot a keresőmezőbe az NLogtal kapcsolatos csomagok megjelenítéséhez.
Válassza az NLog lehetőséget, majd kattintson a telepítés gombra, ha a legújabb stabil verzió van kijelölve.
Kattintson az OK gombra.
Telepítse az NLog.Web.AspNetCore webhelyet is.
A csomag hozzáadva a projekthez.
Nlog.config hozzáadása
Adja hozzá az nlog.config fájlt, az NLog-napló kimeneti definícióját a projekthez. A tartalom XML formátumban van, ezért XML-fájlként hoztam létre. A fájlnévnek nlog.confignak (kisbetűsnek) kell lennie.
Hozza létre a fájlt az alábbiak szerint: A részletes beállításokat később tárgyaljuk.
<?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>
Győződjön meg arról, hogy az nlog.config tulajdonságai Build Action: Content, Copy to Output Directory: Copy if New ( Új példány) beállításra vannak állítva.
Appsetting.json szerkesztése
Alapértelmezés szerint az nlog.config beállítástól függetlenül csak Information
ezek a szintek kimenetek.
Ennek az az oka, hogy a naplózás az appsetting.jsonra is támaszkodik.
Nyissa meg az appsetting.json Logging.LogLevel.Default
alkalmazást, és módosítsa az értéket Trace
.
Ha NLogot használ, módosíthatja az NLog oldalon található szintet, így gyakorlatilag minden szintet Trace
kiadhat az appsetting.json beállításával.
{
"Logging": {
"LogLevel": {
"Default": "Trace",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
Is, a fejlesztés során, appsettings. A Development.json beállításai be vannak töltve, ezért azokat is megváltoztatjuk.
{
"DetailedErrors": true,
"Logging": {
"LogLevel": {
"Default": "Trace",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
}
}
Programok előkészítése az NLog számára
Adjon hozzá egy programot, hogy bejelentkezhet az NLog mechanizmusba.
Nyissa .cs programfájlt, és javítsa ki az alábbiak szerint:
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 のセットアップ
}
Naplózási
Az MVC projektek HomeComtroller
esetében a IndexModel
Razor-oldalak esetében a ILogger<IndexModel> logger
konstruktorhoz került volna.
A privát mezőre is _logger
be van állítva, így naplózhatja.
Az alábbi példa egy Razor oldal kimenetére, de az MVC ugyanazokkal a kóddal tud kimenetet kimenő.
// 省略
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("ページを表示するタイミングでログを出力します。");
}
}
Hibakereséskor úgy gondolom, hogy naplófájl készülhet a projekt mappájában.
A naplót a fájl tartalmának megnézésekor ellenőrizheti.
Minta nlog.config kommentár
Elmagyarázom, de nem magyarázom el a kevésbé fontos részeket.
<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">
Vannak paraméterek, például maga az NLog naplókimeneti beállításai.
internalLogFile
lesz a cél a napló. Ez hasznos lehet például, ha hiba van a napló kimenetében. ${basedir}
a program végrehajtási mappájára utal.
internalLogLevel
az NLog-napló kimeneti szintje. Off
ha igen, akkor egyáltalán nem lesz kimenet.
<!-- ログの出力レイアウトを変数 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})" />
A változó értéke az, hogy a napló tartalma milyen elrendezésben lesz kimenő. Közvetlenül is beírhat későbbi célokba, de ha ugyanannak az elrendezésnek a többszörösét adja meg, könnyebb kezelni őket egy változóban.
Jobb, ha a hivatalos weboldalra hivatkozik, hogy milyen paramétereket lehet megadni az elrendezésben.
Referenciaként az itt megadott paraméterek a következő formátumban vannak kimenettel:
Paraméter kimeneti | tartalma |
---|---|
hosszúdátum | Dátum és idő percek, mint például "2021-03-17 11:46:36.5034" |
eseménytulajdonságok | Megjeleníti a program által megadott naplókimenet eseményazonosítóját stb. |
Szinten | Szintek, mint például a nyomkövetés és a hiba |
Üzenetet | A programnaplózásban megadott üzenet |
Kivétel | Mi történik, ha kivételt ad át a programnaplózásban? |
hívhely | Naplózási hely, fájlnév stb. |
Példa kimenetre
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>
Megadja a kimeneti célt. Több is megadva.
Az első xsi:type="Trace"
megadja , és a napló nyomtatása a Visual Studio kimeneti ablakában.
Elsősorban a végrehajtás hibakeresésére használható.
A második xsi:type="File"
a megadott elérési út egy fájlját adja meg és naplózza.
Ha megadja az elérési utat, a naplót a napló dátumának fájljába ${shortdate}
írhatja a napló idején.
A ${aspnet-appbasepath}
webes projekt gyökérmappát is megadja.
Működéskor azonban jobb, ha a naplófájlokat a webkönyvtáron kívülre adja ki a program cseréjéhez és biztonsághoz.
A harmadik meg xsi:type="Console"
van adva, és megjeleníthető a konzolon a konzol alkalmazásban.
ASP.NET Core önmagában nem konzolalkalmazás, de olyan környezetekben is használható, mint a Docker és az Azure, mert az állapot megjeleníthető a konzolon.
Ez a leírás az NLog hivatalos honlapján.
<!-- ロガー名からターゲットにマップするルール -->
<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>
Itt adhatja meg, hogy milyen szintű és milyen típusú naplókat adjon ki a kimenetnek, ahová. Ez a leírás felülről lefelé van alkalmazva.
Az első az, hogy name="*"
az összes naplót a cél, mert a szint writeTo
meg van adva megadása közben .
Ez target
a megadott , így megjelenik a Visual Studio TraceOutput
kimenet.
A második a Microsoft.Hosting.Lifetime
könyvtár naplókimenetének writeTo (コンソール)
kimenete.
A ConsoleLifetime-társítások olyan konzolokon is bevehetőek, mint az Azure és a Docker.
minlevel="Info"
mert megadja Trace
Debug
, és nincs naplózva.
A későbbi definíciók nem eredményeznek final="true"
Microsoft.Hosting.Lifetime
kapcsolódó naplókat.
A harmadik name="Microsoft.*"
az, hogy name="System.Net.Http.*"
állítsa le a final="true"
naplózás megadásával és naplók.
name
*egy helyettesítő karakter, ami azt jelenti, Microsoft
System.Net.Http
hogy az összes kapcsolódó könyvtárra vonatkozik.
, de megáll maxlevel="Info"
Trace
itt, Debug
Information
mert
WArning
A Error
, , napló a későbbi definíciókban is Critical
kimenet.
A negyedik a fent final="true"
leállított naplótól más fájlba való kimenet.
Archív naplók
Van is egy módszer archiválása a régi naplófájlt egy külön mappában minden dátumot csak egy fő naplófájlt.
Például:
<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}" />
Az itt használt paraméterek a következőket jelentik:
Paraméter | leírása |
---|---|
archívSzámozás | A Dátum dátum szerint hoz létre egy archív fájlt. |
archívMinden | Day használják archív napi rendszerességgel. A "Hónap", az "Óra", a "Vasárnap" stb. |
archiveFileName | Elérési út az archiváláshoz. {#} archív alapon változik. |
archívDateFormat | A fájlnév dátum-dátum dátumformátuma. |
maxArchiveFiles | Itt adhatja meg, hogy hány fájlt archiválhat. |
A nem dátummal kapcsolatos módszerek archiválása is lehetséges. További információkért látogasson el a hivatalos honlapra.
Végrehajtáskor így néz ki:
E-mailek küldése naplónként
NLog is lehetővé teszi, hogy küldjön e-maileket, amikor naplózás. Ha azonban e-mailt küld, például hibakeresési naplót, az túl sok lesz ahhoz, hogy Célként csak korlátozott naplószinteket célozhat meg, például a Hiba és a Végzetes szintet. Ezenkívül a hiba kockázatának elkerülése érdekében, mint például a levélkiszolgáló blokkolása a túljeszedés miatt, Javasoljuk, hogy adjon meg egy csak bejelentkezési e-mail fiókot.
Az alábbi példa egy konfigurációra mutat be. Ha ténylegesen e-mailt szeretne küldeni, kövesse a használni kívánt SMTP-kiszolgálót.
<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>
Naplók írása az adatbázisba
Az NLog naplókat is írhat az adatbázisba. Az alábbiakban egy példa, ezért kérjük, olvassa el a hivatalos honlapján a részleteket.
Ez a szakasz azokat a lépéseket ismerteti, amelyekkel írhat egy másik kiszolgálóN az SQL Server kiszolgálóra.
Először hozzon létre egy táblázatot a cél SQL Serverben való naplózáshoz. Mivel kiválaszthatja az írni akarott értéket, oszlopként határozza meg, hogy mire van szüksége naplóként.
Az alábbiakban egy példa a tábla létrehozása 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
Az adatbázis-feldolgozáshoz System.Data.SqlClient
adatbázis-ügyfélkönyvtár szükséges.
Telepítsd a NuGet-ről.
Adatbázisadatokat ír az appsettings.jsonnak. Nlog.config lehetővé teszi, hogy töltse be az információkat appsettings.json. A beállítások feltételesek, ezért kérjük, állítsa be őket a tényleges adatbázisnak megfelelően. A kulcsnév tetszőleges, de az nlog.config használja.
{
"": "省略",
"NlogConnection": {
"DbHost": "ServerName\\SQLEXPRESS",
"Database": "TestDatabase",
"User": "UserName",
"Password": "********"
}
}
Állítsa be az nlog.config fájlt az alábbiak szerint:
<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>
Ha nincsenek futtatható hibák, a következőképpen lesz megírva:
By the way.cs megjegyzik, hogy megpróbálja írni naplókat az adatbázisba a korai szakaszban, például mielőtt program .cs CreateHostBuilder
módszerek, sikertelen lehet.
Naplózók bekérése a RequestServices szolgáltatásból és naplózása
Fárasztó lehet minden új vezérlő vagy oldalmodell létrehozásakor hozzáadni ILogger
a konstruktorhoz.
Alternatív RequestServices
megoldásként, akkor kap a .
public void OnGet()
{
// RequestServices から ILogger を取得する
var logger = (ILogger<IndexModel>)HttpContext.RequestServices.GetService(typeof(ILogger<IndexModel>));
logger.LogInformation("ページを表示するタイミングでログを出力します。");
}
Ha a saját vezérlő vagy oldalmodell megadása is nehézkes, létrehozhat bővítménymódszereket vagy alaposztályokat.
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>));
}
Esetek használata
public void OnGet()
{
// RequestServices から ILogger を取得する (this. は必要)
var logger = this.GetLogger();
logger.LogInformation("ページを表示するタイミングでログを出力します。");
}