MS_NLog - NetDevInfraWGinOSSConsortium/NetDevInfraWiki GitHub Wiki

NLog

抂芁

log4net ず I/F レベルで仕様の互換性は高い。

補足NLog の珟況: log4net ず比べた
珟圚の立ち䜍眮を先に瀺しおおく。

log4net NLog Serilog
開発 Apache。䞀時䌑止 → 再開 継続的に掻発 ★ 掻発
蚭蚈思想 log4j 由来テキスト ログ log4j 由来独自拡匵 構造化ログが前提 ★
蚭定 XML XML / JSON / コヌド 䞻にコヌド
.NET 察応 .NET 8 等に察応 察応が速い 察応が速い
ILogger 統合 あり ありNLog.Extensions.Logging ありSerilog.AspNetCore
新芏採甚 少ない あり 最も倚い
【珟圚の指針】[.NETのログ](MS_DotNetLogging) ず同じ
   ・アプリのコヌドは【ILogger<T> に曞く】★
   ・NLog / Serilog は【その裏偎のプロバむダヌ】ずしお䜿う
   → 出力先ラむブラリは埌から差し替えられる状態にしおおく

詳现

log4net ずの違い

レむアりトLayout

log4net ず同様に、

  • アペンダが出力するログのフォヌマットヘッダずボティを定矩する。
  • 豊富なレむアりト・レンダラヌが準備されおいる。

タヌゲットTarget

log4net の Appender ず同様

  • ラッパヌ・タヌゲットずいうバッファリング・レむダを挿入できるらしい。

ロガヌLogger

こちらも、log4net ず同様

ログ ヘッダ

log4net ず同様にレむアりトで定矩。

ログ レベル

log4net ず比べるず、Trace が増蚭されおいる。

補足ラッパヌ タヌゲットが NLog の特城: 原文が「らしい」ず
曞いおいるラッパヌ タヌゲットは、
NLog を遞ぶ実質的な理由の 1 ぀なので具䜓化しおおく。

【発想】
   Target出力先を【別の Target で包む】こずができる
     → デコレヌタヌ パタヌン
     → [゚ンコヌディング](MS_Encoding) の Stream の重ね方ず同じ発想 ★
ラッパヌ 効果
AsyncWrapper 非同期化。呌び出し偎を埅たせない ★
BufferingWrapper バッファリングしおたずめお曞く
RetryingWrapper 倱敗したら再詊行する
FallbackGroup 倱敗したら別の出力先ぞDB → ファむル 等
AutoFlushWrapper 特定条件Error 以䞊で匷制フラッシュ
FilteringWrapper 条件に合うものだけ通す
LimitingWrapper 単䜍時間あたりの件数を制限ログの措氎察策
<!-- 䟋非同期倱敗時のフォヌルバック -->
<target name="db" xsi:type="FallbackGroup">
  <target xsi:type="AsyncWrapper">
    <target xsi:type="Database" connectionString="..." />
  </target>
  <target xsi:type="File" fileName="logs/fallback.log" />
</target>
【これが解決するこず】
   [log4net](MS_ApacheLog4net) の AdoNetAppender の問題
     「DB が萜ちるずアプリたで萜ちる遅くなる」
       → AsyncWrapper で【業務凊理を埅たせない】
       → FallbackGroup で【DB が駄目ならファむルぞ】★

   ただし、非同期化には代償がある
       → プロセスが匷制終了するず【バッファ内のログが倱われる】
       → 終了時に LogManager.Shutdown() を呌ぶ
       → 重芁なログには AutoFlushWrapper を䜵甚する

**LimitingWrapper件数制限**も実務で効く。

【ログの措氎】
   ルヌプの䞭で䟋倖が出続ける
     → 1 秒間に数䞇行
     → ディスクが埋たる、他のログが埋もれる、CPU を食う ★
   → LimitingWrapper で䞊限を蚭ける

参考

移行メモ「log4net の開発䌑止宣蚀」に぀いお: 参考リンクは
2020 幎時点の状況を反映しおいる。
Apache log4net に蚘した通り、
その埌 log4net はメンテナンスが再開された。

【したがっお】
   「log4net は開発が止たったから移行が必芁」ずいう
   圓時の前提は【珟圚は圓おはたらない】★

【珟圚、移行を怜蚎する理由があるずすれば】
   ・構造化ログにしたいSerilog / NLog の JSON 出力
   ・ILogger 経由に統䞀したい
   ・ラッパヌ タヌゲットのような機胜が欲しい
   ・.NET の新しい版ぞの远随速床

【移行しない刀断も劥圓】
   ・動いおいるものを觊るリスク
   ・ログの圢匏が倉わるず、既存の解析基盀・運甚手順に圱響する
   → ILogger 経由に寄せおおけば、必芁になった時点で差し替えられる

ログの蚭定

ロヌリング

  • タヌゲットアペンダがあるのではなく、ファむルの堎合の属性ずしお指定する。

  • たた、属性は、archive 系属性ず、fileName 属性を個別に䜿甚する䜵甚は䞍可胜ずのこず。

  • 参考

補足log4net ずの蚭蚈の違い: 原文が指摘する
**「タヌゲットが別にあるのではなく、属性ずしお指定する」**ずいう
違いは重芁である。

【log4net】
   FileAppender ず RollingFileAppender が【別のクラス】
     → ロヌリングするかどうかで型を遞ぶ

【NLog】
   File タヌゲットが 1 ぀あり、
   【archive* 属性を曞けばロヌリングになる】★
     → 型を倉えずに蚭定だけで切り替えられる
<!-- 日付でアヌカむブ珟圚の䞀般的な曞き方 -->
<target name="file" xsi:type="File"
        fileName="${basedir}/logs/app.log"
        archiveFileName="${basedir}/logs/archives/app.{#}.log"
        archiveEvery="Day"
        archiveNumbering="Date"
        archiveDateFormat="yyyyMMdd"
        maxArchiveFiles="30"          <!-- ← 保持䞖代数 ★ -->
        encoding="utf-8"
        concurrentWrites="true"
        keepFileOpen="true"
        layout="${longdate}|${level:uppercase=true}|${logger}|${message} ${exception:format=tostring}" />

maxArchiveFiles が log4net にない利点である。

【log4net の composite の問題】[Apache log4net](MS_ApacheLog4net) 参照
   日付サむズの䜵甚では【叀い日付が消えない】 ディスクを食う

【NLog では】
   maxArchiveFiles で【総䞖代数を制限できる】★
   maxArchiveDays で【保持日数を制限できる】
     → ディスク枯枇を蚭定だけで防げる

原文の「䜵甚は䞍可胜」に぀いお:

【圓時の制玄】
   fileName に ${shortdate} を入れお日付分割する方匏ず、
   archiveFileName によるアヌカむブ方匏は【䜵甚できない】
     → 前者は「その日のファむルに曞く」
     → 埌者は「曞き終えたら別名で退避する」
     → 圹割が重耇するため

【珟圚の掚奚】
   ・【archive* 系を䜿う】䞖代管理ができるため★
   ・fileName に日付を埋める方匏は、䞖代管理ができない

【なお、珟圚の NLog では】
   䞡者を組み合わせた堎合の挙動が改善されおいるが、
   【意図が読みにくくなる】ため、どちらかに統䞀するのが無難

性胜に関わる属性も抌さえおおく。

keepFileOpen="true"     
 ファむルを開いたたたにする【速い】★
concurrentWrites="true" 
 耇数プロセスからの曞き蟌みを蚱す
                          [Apache log4net](MS_ApacheLog4net) の MinimalLock 盞圓

【䞡立させるず遅くなる】
   → 耇数プロセスから曞く必芁がないなら
     concurrentWrites="false" + keepFileOpen="true" が最速
   → プロセスごずにファむルを分ける方が根本的
       fileName="logs/app_${processid}.log"

詳现・䟋

ログ出力方匏 (NLog) - Open 棟梁 WikiOTR_LoggingNLog.md

補足ASP.NET Core / ILogger ずの統合: 原文は
.NET Framework 期の蚘述だが、珟圚の䜿い方を補っおおく。

// Program.csASP.NET Core
using NLog.Web;

var builder = WebApplication.CreateBuilder(args);
builder.Logging.ClearProviders();
builder.Host.UseNLog();          // ← NLog を ILogger の裏偎にする ★
// アプリのコヌドは ILogger<T> のたたNLog に䟝存しない
public class OrderService(ILogger<OrderService> logger)
{
    public void Place(Order o)
        => logger.LogInformation("Order {OrderId} placed by {UserId}", o.Id, o.UserId);
}
<!-- 構造化JSONで出す -->
<target name="json" xsi:type="File" fileName="logs/app.json">
  <layout xsi:type="JsonLayout" includeEventProperties="true">
    <attribute name="time"    layout="${date:format=o}" />
    <attribute name="level"   layout="${level}" />
    <attribute name="logger"  layout="${logger}" />
    <attribute name="message" layout="${message}" />
    <attribute name="traceId" layout="${activity:property=TraceId}" />
    <attribute name="exception" layout="${exception:format=tostring}" />
  </layout>
</target>
【JsonLayout の䟡倀】★
   includeEventProperties="true" にするず、
   ILogger のテンプレヌト匕数{OrderId} 等が
   【個別のフィヌルドずしお出力される】
     → 収集基盀Elasticsearch / Log Analyticsで
       OrderId による怜玢・集蚈ができる
     → [.NETのログ](MS_DotNetLogging) の「構造化ログ」がここで効く
【NLog 䜿甚時の泚意】
 ① 【終了時に必ず Shutdown する】★
      LogManager.Shutdown();
      → AsyncWrapper 䜿甚時、バッファ内のログが倱われるのを防ぐ
 ② 【起動盎埌のログ】
      ホストの構築前に䟋倖が出るずログが残らない
      → try/catch で囲み、NLog を先に初期化しおおく定石がある
 ③ 【蚭定の自動リロヌド】
      <nlog autoReload="true"> で実行䞭の倉曎を反映できる
      → log4net の Watch=true 盞圓

参考

Microsoft Learn


Tags: 移行, プログラミング, .NET開発

⚠ **GitHub.com Fallback** ⚠