Kirjaa lokiin NLog-lokin avulla
Ympäristö
- Visuaalinen studio
-
- Visual Studio 2019
- ASP.NET ydin
-
- 5.0 (MVC, Razor-sivu)
Aluksi.
NLogin avulla voit tulostaa lokit tiedostoihin, sähköposteihin ja tietokantoihin asetusten mukaan.
NLog ASP.NET on sisällytettävä ytimen vakiokirjausjärjestelmään. Lokit on mahdollista tulostaa asetusten mukaan oletuslokia käytettäessä.
Tietoja lokitasoista
Microsoft-lokit ja NLog-lokit on jaettu kuuteen vaiheeseen, ja tulostustasot ovat suunnilleen samat:
Taso | Microsoft | NLog |
---|---|---|
0 | Jäljittää | Jäljittää |
1 | Debug | Debug |
2 | Huoneesta | Info |
3 | Varoitus | Varoittaa |
4 | Virhe | Virhe |
5 | Kriittinen | Kohtalokas |
(6) | (Ei mitään) | Ei, ei, ei. |
Mitä korkeampi taso, sitä tärkeämpi loki on, ja sitä todennäköisemmin se kirjoitetaan lokin tulostusrajoituksista riippumatta.
Kirjaamisohjeet
NLog-paketin käyttöönotto
ASP.NET kun olet luonut Ydinprojektin, lisää paketti.
Napsauta projektin riippuvuuksia hiiren kakkospainikkeella ja valitse Hallitse NuGet-paketteja.
Valitse Selaa-välilehti ja tuo NLogiin liittyvät paketit näkyviin kirjoittamalla hakukenttään NLog.
Valitse NLog ja napsauta sitten asennuspainiketta, jossa uusin vakaa versio on valittuna.
Valitse OK.
Asenna myös NLog.Web.AspNetCore.
Paketti on lisätty projektiin.
Lisää nlog.config
Lisää projektiin nlog.config, NLog-lokin tulostusmääritys. Sisältö on XML-muodossa, joten loin sen XML-tiedostona. Tiedostonimen on oltava nlog.config (pienillä kirjaimilla).
Luo tiedosto seuraavasti: Yksityiskohtaisista asetuksista keskustellaan myöhemmin.
<?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>
Varmista, että nlog.config-tiedoston ominaisuudet ovat Muodosta toiminto: Sisältö, Kopioi tulostuskansioon: Kopioi, jos uusi.
Muokkaa appsetting.json
Oletusarvon mukaan vain nämä tasot tulostuvat riippumatta siitä, miten nlog.config Information
määritetään.
Tämä johtuu siitä, että kirjaaminen perustuu myös appsetting.jsoniin.
Avaa appsetting.json Logging.LogLevel.Default
ja muuta arvoksi Trace
.
Jos käytät NLog-sovellusta, voit säätää NLog-puolen tasoa, joten voit tulostaa käytännössä kaikki Trace
tasot asettamalla appsetting.json.
{
"Logging": {
"LogLevel": {
"Default": "Trace",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
Myös kehityksen aikana appsettings. Development.json-asetukset on ladattu, joten muutamme myös niitä.
{
"DetailedErrors": true,
"Logging": {
"LogLevel": {
"Default": "Trace",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
}
}
Valmistellaan ohjelmia NLog-ohjelmaa varten
Lisää ohjelma, jotta voit kirjautua NLog-mekanismiin.
Avaa .cs ohjelmatiedosto ja korjaa se seuraavasti:
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 のセットアップ
}
Kirjaaminen
HomeComtroller
MVC-projekteissa, IndexModel
Razor-sivuilla, sinut olisi ILogger<IndexModel> logger
välitetty konstruktorille.
Sen arvoksi on _logger
määritetty myös yksityinen kenttä, joten voit käyttää sitä kirjautumisena.
Seuraavassa on esimerkki Razor-sivun tulostista, mutta MVC voi tulostaa samalla koodilla.
// 省略
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("ページを表示するタイミングでログを出力します。");
}
}
Kun virheenkorjaus tehdään, luulen, että lokitiedosto voidaan tehdä projektin kansioon.
Voit tarkistaa lokin tarkastelemalla tiedoston sisältöä.
Esimerkki nlog.config-kommentista
Selitän sen järjestyksessä, mutta en vähemmän tärkeitä osia.
<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 olemassa parametreja, kuten itse NLog-lokin tulostusasetukset.
internalLogFile
on lokin määränpää. Tästä voi olla hyötyä esimerkiksi silloin, jos itse lokin tulosteessa on virhe. ${basedir}
viittaa ohjelman suorituskansioon.
internalLogLevel
on NLog-lokin tulostustaso. Off
Jos se on, sitä ei tulosteta ollenkaan.
<!-- ログの出力レイアウトを変数 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})" />
Muuttujan arvoksi on määritetty, mihin asetteluun lokin sisältö tulostetaan. Voit kirjoittaa suoraan myöhempiin kohteisiin, mutta jos määrität saman asettelun kerrannaisten, niitä on helpompi hallita yhdessä muuttujassa.
On parempi viitata viralliseen verkkosivustoon nähdäksesi, mitä parametreja asettelussa voidaan määrittää.
Tässä määritetyt parametrit tulostuvat seuraavassa muodossa:
Parametrien | tulostussisältö |
---|---|
pitkäikäis | Päivämäärä- ja aikaminuutteina, kuten "2021-03-17 11:46:36.5034" |
tapahtuman ominaisuudet | Näyttää ohjelman määrittämän lokilähdön tapahtumatunnuksen jne. |
Tasolla | Tasot, kuten Jäljitys ja virhe |
Viesti | Ohjelman lokiin kirjaamisen yhteydessä määritetty viesti |
Poikkeus | Entä jos ohitat poikkeuksen ohjelman kirjaamisen yhteydessä |
kutsusivusto | Lokiin kirjaamisen sijainti, tiedostonimi jne. |
Esimerkki tulosteista
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äärittää tulostettavan kohteen. Useita voidaan määrittää.
Ensimmäinen xsi:type="Trace"
määrittää , ja loki tulostetaan Visual Studion tulostusikkunaan.
Sitä voidaan käyttää ensisijaisesti suorittamisen virheenkorjaamiseen.
Toinen xsi:type="File"
määrittää määritetyssä polussa olevan tiedoston ja kirjaa sen lokiin.
Jos ${shortdate}
määrität polussa, voit kirjoittaa lokin lokin päivämäärän lokiin lokin ajankohtana.
Määrittää ${aspnet-appbasepath}
myös Web-projektin pääkansion.
Kun toimit, on kuitenkin parempi tulostaa lokitiedostoja Web-hakemiston ulkopuolelle ohjelman korvaamista ja suojausta varten.
Kolmas on xsi:type="Console"
määritetty, ja se voidaan näyttää konsolisovelluksen konsolissa.
ASP.NET Core itsessään ei ole konsolisovellus, mutta sitä voidaan käyttää myös dockerin ja Azuren kaltaisissa ympäristöissä, koska tila voidaan näyttää konsolissa.
Tämä on kuvaus NLogin virallisella verkkosivustolla.
<!-- ロガー名からターゲットにマップするルール -->
<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>
Tässä voit määrittää, minkä taso ja minkä tyyppisiä lokeja tulosteta mihinkin. Tätä kuvausta käytetään ylhäältä ylös.
Ensimmäinen on kaikkien name="*"
lokien tulostaminen kohteeseen, koska taso on writeTo
määritetty määritettäessä .
Tämä target
on -kohdassa määritetty, joten se TraceOutput
näkyy Visual Studion tulosteessa.
Toinen Microsoft.Hosting.Lifetime
tuloste tuloste on kirjaston lokitulosteeseen. writeTo (コンソール)
ConsoleLifetime-kytkennät voidaan tarkistaa konsoleista, kuten Azure ja Docker.
minlevel="Info"
koska se Trace
Debug
määrittää , eikä sitä kirjata lokiin.
Seuraavat määritelmät eivät myöskään tulosta toisiinsa final="true"
Microsoft.Hosting.Lifetime
liittyviä lokeja.
Kolmas on name="Microsoft.*"
lopettaa name="System.Net.Http.*"
kirjaaminen final="true"
määrittämällä - ja -lokit.
name
*on yleismerkki, mikä tarkoittaa, Microsoft
System.Net.Http
että se viittaa kaikkiin siihen liittyviin kirjastoihin.
Mutta lopeta maxlevel="Info"
Trace
Debug
Information
tähän, koska.
WArning
- Error
ja -loki tulostetusti myös myöhemmissä Critical
määritelmissä.
Neljäs tuloste tuloste on final="true"
tulostettu muuhun kuin yllä pysäytettyun lokiin.
Arkistoinnin lokit
On myös olemassa tapa arkistoida vanha lokitiedosto erilliseen kansioon kullekin päivämäärälle, jossa on vain yksi päälokitiedosto.
Esimerkiksi:
<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}" />
Tässä käytetyt parametrit tarkoittavat:
Parametrin | kuvaus |
---|---|
arkistoNumeroiminen | Päivämäärä luo arkistotiedoston päivämäärän mukaan. |
arkistoEvery | Päivää käytetään arkistointiin päivittäin. On myös tapoja määrittää "Kuukausi", "Tunti", "Sunnuntai" jne. |
archiveFileName-nimi | Polku arkistoida. {#} muuttuu arkistoittain. |
arkistoDateFormat | Tiedostonimen päivämääräpäivämuoto. |
maxArchiveFiles-tiedosto | Määrittää, kuinka monta tiedostoa arkistoidaan. |
On myös tapoja arkistoida muita kuin päivämäärämenetelmiä. Lisätietoja on virallisella verkkosivustolla.
Kun se suoritetaan, se näyttää tältä:
Sähköpostien lähettäminen lokia kohden
NLogin avulla voit myös lähettää sähköposteja kirjautuessasi. Jos kuitenkin lähetät sähköpostia, kuten virheenkorjauslokin, siitä tulee liian paljon lähetettävää, On hyvä kohdistaa vain rajoitetut lokitasot, kuten Virhe ja Kohtalokas. Lisäksi virheriskin välttämiseksi, kuten postipalvelimen estäminen ylilähetysten vuoksi, Suosittelemme, että määrität vain lokiin kirjautulle sähköpostitilille.
Seuraavassa on esimerkki konfiguraatiosta. Jos haluat todella lähettää sähköpostia, seuraa smtp-palvelinta, jota haluat käyttää.
<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>
Lokien kirjoittaminen tietokantaan
NLog voi myös kirjoittaa lokeja tietokantaan. Seuraava on esimerkki, joten katso lisätietoja viralliselta verkkosivustolta.
Tässä osassa kuvataan vaiheet, jotka on kirjoitettava SQL Serveriin eri palvelimessa.
Luo ensin taulukko SQL Server -kohteeseen kirjautumista varten. Koska voit valita kirjoitettavan arvon, määritä loki sarakkeeksi.
Seuraavassa on esimerkki taulukon luomisen SQL:stä.
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
Tietokannan käsittelyyn tarvitaan System.Data.SqlClient
tietokanta-asiakaskirjasto.
Asennetaan se NuGetista.
Kirjoittaa tietokannan tiedot appsettings.json-sivustoon. nlog.configin avulla voit ladata tiedot appsettings.json-sivustossa. Asetukset ovat alustavat, joten aseta ne todellisen tietokannan mukaan. Avaimen nimi on mielivaltainen, mutta sitä käyttää nlog.config.
{
"": "省略",
"NlogConnection": {
"DbHost": "ServerName\\SQLEXPRESS",
"Database": "TestDatabase",
"User": "UserName",
"Password": "********"
}
}
Aseta nlog.config seuraavasti:
<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>
Jos virheitä ei ole, se kirjoitetaan seuraavasti:
Huomaa muuten.cs että lokien kirjoittaminen tietokantaan varhaisessa vaiheessa, kuten ennen ohjelman CreateHostBuilder
.cs, saattaa epäonnistua.
Hae loggerit RequestServices-palveluista ja kirjaa ne lokiin
Konstruktoriin lisääminen voi olla työlästä aina, kun ILogger
luot uuden ohjaimen tai sivumallin.
Vaihtoehtoisesti RequestServices
voit saada .
public void OnGet()
{
// RequestServices から ILogger を取得する
var logger = (ILogger<IndexModel>)HttpContext.RequestServices.GetService(typeof(ILogger<IndexModel>));
logger.LogInformation("ページを表示するタイミングでログを出力します。");
}
Jos myös oman ohjain- tai sivumallin määrittäminen on hankalaa, voit luoda laajennusmenetelmiä tai perusluokkia.
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>));
}
Käytä koteloita
public void OnGet()
{
// RequestServices から ILogger を取得する (this. は必要)
var logger = this.GetLogger();
logger.LogInformation("ページを表示するタイミングでログを出力します。");
}