Logimiseks kasutage NLogi
Keskkond
- Visuaalstuudio
-
- Visuaalstuudio 2019
- ASP.NET Tuum
-
- 5.0 (MVC, Razori leht)
Alguses
NLog võimaldab teil väljastada logisid failidele, e-kirjadele ja andmebaasidele sõltuvalt teie sätetest.
NLog ASP.NET lisada core'i standardsesse logimissüsteemi. Logisid on võimalik vaikelogija abil väljastada vastavalt sätetele.
Teave logitasemete kohta
Microsofti logid ja NLogid on jagatud kuueks etapiks ja väljundtasemed on umbes samad:
Tase | Microsoft | NLog |
---|---|---|
0 | Jälgi | Jälgi |
1 | Debug | Debug |
2 | Teavet | Info |
3 | Hoiatus | Hoiatada |
4 | Viga | Viga |
5 | Kriitiline | Surmaga |
(6) | (Pole) | (Väljas) |
Mida kõrgem on tase, seda olulisem on logi ja seda tõenäolisem on selle kirjutamine sõltumata logi väljundi piirangutest.
Logimisjuhised
NLog paketi juurutamine
ASP.NET olete loonud Core'i projekti, lisage pakett.
Paremklõpsake oma projekti sõltuvusi ja valige Käsk Halda NuGeti pakette.
NLogiga seotud pakettide kuvamiseks klõpsake vahekaarti Sirvi ja tippige otsinguväljale NLog.
Valige NLog ja seejärel klõpsake installinuppu, kus on valitud uusim stabiilne versioon.
Klõpsake nuppu OK.
Installige ka NLog.Web.AspNetCore.
Pakett on projekti lisatud.
Lisa nlog.config
Lisage projekti NLog logi väljundmääratlus nlog.config. Sisu on XML-vormingus, seega lõin selle XML-failina. Faili nimi peaks olema nlog.config (väiketäht).
Looge fail järgmiselt: Üksikasjalikke sätteid arutatakse hiljem.
<?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>
Veenduge, et atribuudid nlog.config on seatud järk tegevus: sisu, kopeeri väljundkataloogi: kopeerige, kui uus.
Redigeeri appsetting.json
Vaikimisi, olenemata sellest, kuidas määrate faili nlog.config, Information
on väljundiks ainult need tasemed.
Seda seetõttu, et logimine tugineb ka appsetting.json.
Avage appsetting.json Logging.LogLevel.Default
ja muutke väärtus väärtuseks Trace
.
Kui kasutate NLogi, saate taset reguleerida NLogi poolel, nii et saate rakenduse appsetting.json seadmisega väljastada peaaegu kõik Trace
tasemed.
{
"Logging": {
"LogLevel": {
"Default": "Trace",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
Samuti on arenduse ajal appsettings. Development.json seaded on laetud, nii et me muudame neid ka.
{
"DetailedErrors": true,
"Logging": {
"LogLevel": {
"Default": "Trace",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
}
}
Programmide ettevalmistamine NLogi jaoks
Lisage programm, et saaksite NLog-mehhanismi sisse logida.
Avage .cs programmifail ja parandage see järgmiselt:
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 のセットアップ
}
Metsaraie
MVC projektide HomeComtroller
puhul , Razori lehtede puhul, IndexModel
oleks teid ILogger<IndexModel> logger
konstruktorile edastatud.
Selle väärtuseks on seatud ka _logger
privaatväli, nii et saate seda kasutada logimiseks.
Järgnev on näide Razori lehe väljundist, kuid MVC saab sama koodiga väljastada.
// 省略
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("ページを表示するタイミングでログを出力します。");
}
}
Silumisel arvan, et projekti kausta saab teha logifaili.
Logi kontrollimiseks vaadake faili sisu.
Nlog.config kommentaariumi näidis
Ma seletan seda järjekorras, aga ma ei selgita vähem tähtsaid osi.
<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">
On parameetreid, näiteks NLogi enda logiväljundi sätted.
internalLogFile
on logi sihtkoht. See võib olla kasulik näiteks juhul, kui logi enda väljundis on viga. ${basedir}
viitab programmi täitmiskaustale.
internalLogLevel
on NLogi logi väljundtase. Off
kui on, siis ei ole see üldse väljund.
<!-- ログの出力レイアウトを変数 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})" />
Muutuja on seatud sellele, millises paigutuses logi sisu väljastatakse. Saate tippida otse hilisematesse sihtmärkidesse, kuid kui määrate sama paigutuse mitu, on neid lihtsam hallata ühes muutujas.
Parem on viidata ametlikule veebisaidile, et näha, milliseid parameetreid saab paigutuses määrata.
Viiteks on siin määratud parameetrid väljund järgmises vormingus:
Parameetri | väljundsisu |
---|---|
longdate | Kuupäeva ja kellaaja minutid nagu "2021-03-17 11:46:36.5034" |
sündmuse atribuudid | Kuvab programmi määratud logiväljundi sündmuse ID jne. |
Tasandil | Tasemed nagu Jälitus ja Tõrge |
Sõnum | Programmi logimisel määratud teade |
Erand | Mida teha, kui läbite programmi logimisel erandi? |
kutsuja | Logimiskoht, faili nimi jne. |
Väljundi näide
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>
Määrab väljundi sihtmärgi. Määrata saab mitu.
Esimene xsi:type="Trace"
määrab ja logi prinditakse Visual Studio väljundaknas.
Seda saab kasutada peamiselt silumise käivitamiseks.
Teine xsi:type="File"
määrab ja logib määratud tee faili.
Kui ${shortdate}
määrate tee, saate logi kirjutada logi kuupäeva faili logi ajal.
Määrab ka ${aspnet-appbasepath}
veebiprojekti juurkausta.
Kuid töötamisel on parem programmi asendamiseks ja turvalisuseks väljastada logifaile väljaspool veebikataloogi.
Kolmas on xsi:type="Console"
määratud ja seda saab konsoolirakenduse konsoolis kuvada.
ASP.NET Core ise ei ole konsooli rakendus, kuid seda saab kasutada ka sellistes keskkondades nagu Docker ja Azure, kuna olekut saab konsoolis kuvada.
See on kirjeldus NLogi ametlikul veebisaidil.
<!-- ロガー名からターゲットにマップするルール -->
<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>
Siin saate määrata, millisel tasemel ja mis tüüpi logisid väljastada kuhu. Seda kirjeldust rakendatakse ülevalt üles.
Esimene on name="*"
kõigi logide väljastamine sihtmärgile, kuna tase on writeTo
määratud .
See target
on jaotises määratud, nii et see kuvatakse TraceOutput
Visual Studio väljundis.
Teine on Microsoft.Hosting.Lifetime
väljund logi väljundisse writeTo (コンソール)
teegis.
ConsoleLifetime'i seoseid saab kontrollida konsoolides nagu Azure ja Docker.
minlevel="Info"
kuna see Trace
Debug
määrab ja pole logitud.
Samuti ei väljasta järgnevad final="true"
Microsoft.Hosting.Lifetime
määratlused seotud logisid.
Kolmas name="Microsoft.*"
on name="System.Net.Http.*"
logimise final="true"
lõpetamine, määrates ja logid.
name
*on metamärk, mis tähendab, Microsoft
System.Net.Http
et see viitab kõigile seotud teekidele.
, kuid lõpetage siin maxlevel="Info"
Trace
, Debug
Information
sest
WArning
Logi Error
, on väljund ka järgmistes Critical
määratlustes.
Neljas on väljund final="true"
faili, mis pole ülal peatatud logi.
Logide arhiveerimine
Samuti on olemas meetod vana logifaili arhiveerimiseks eraldi kausta iga kuupäeva jaoks, millel on ainult üks peamine logifail.
Näiteks:
<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}" />
Siin kasutatavad parameetrid tähendavad:
Parameetri | kirjeldus |
---|---|
arhiivNummerdamine | Kuupäev loob arhiivifaili kuupäeva järgi. |
arhiivEvery | Päeva kasutatakse igapäevaseks arhiveerimiseks. Samuti on võimalik määrata "Kuu", "Tund", "Pühapäev" jne. |
arhiivFileName | Arhiivimise tee. {#} muutub arhiivipõhiselt. |
arhiivDateFormat | Failinime kuupäevapõhise arhiivi kuupäevavormingus. |
maxArchiveFiles | Määrab, mitu faili kuni arhiivida. |
Kuupäevaväliste meetodite arhiveerimiseks on ka viise. Lisateavet leiate ametlikust veebisaidilt.
Kui see hukatakse, näeb see välja selline:
Saada e-kirju logi kohta
NLog võimaldab teil ka logimisel e-kirju saata. Kuid kui saadate e-kirja, näiteks silumislogi, muutub see liiga palju saatmiseks, Mõistlik on sihtida ainult piiratud logitasemeid (nt Viga ja Saatuslik). Lisaks, et vältida ebaõnnestumise ohtu, näiteks postiserveri blokeerimine üleedastuse tõttu, Soovitame määrata ainult logitud meilikonto.
Järgnev on konfiguratsiooni näide. Kui soovite tegelikult meili saata, järgige SMTP-serverit, mida soovite kasutada.
<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>
Logide kirjutamine andmebaasi
NLog võib kirjutada logisid ka andmebaasi. Järgnev on näide, nii et lisateabe saamiseks vaadake ametlikku veebisaiti.
Selles jaotises kirjeldatakse juhiseid SQL Serverisse kirjutamiseks mõnes muus serveris.
Esmalt looge tabel siht-SQL Serverisse logimiseks. Kuna saate valida kirjutatava väärtuse, määratlege, mida vajate logina veeruna.
Järgnev on näide tabeli loomise SQL-ist.
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
Andmebaasi töötlemiseks on vaja andmebaasi System.Data.SqlClient
klienditeeki.
Paigaldame selle NuGetist.
Kirjutab andmebaasiteabe rakendusse appsettings.json. nlog.config võimaldab teil laadida teavet appsettings.json. Seaded on ebalevad, nii et palun seadke need vastavalt tegelikule andmebaasile. Võtme nimi on meelevaldne, kuid seda kasutab nlog.config.
{
"": "省略",
"NlogConnection": {
"DbHost": "ServerName\\SQLEXPRESS",
"Database": "TestDatabase",
"User": "UserName",
"Password": "********"
}
}
Seadke nlog.config järgmiselt:
<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>
Kui käivitada ei ole vigu, kirjutatakse see järgmiselt:
Muide.cs pange tähele, et proovides kirjutada logisid andmebaasi varases etapis, näiteks enne programmi .cs CreateHostBuilder
meetodeid, võib nurjuda.
Logijate toomine RequestServices'ist ja nende logimine
Konstruktorile võib olla tüütu lisada iga kord, kui ILogger
loote uue kontrolleri või leheküljemudeli.
Teise võimalusena RequestServices
saate .
public void OnGet()
{
// RequestServices から ILogger を取得する
var logger = (ILogger<IndexModel>)HttpContext.RequestServices.GetService(typeof(ILogger<IndexModel>));
logger.LogInformation("ページを表示するタイミングでログを出力します。");
}
Kui ka oma kontrolleri või lehemudeli määramine on tülikas, saate luua laiendusmeetodeid või põhiklasse.
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>));
}
Kasuta teenindusjuhtumeid
public void OnGet()
{
// RequestServices から ILogger を取得する (this. は必要)
var logger = this.GetLogger();
logger.LogInformation("ページを表示するタイミングでログを出力します。");
}