セージ の メモ書き

メモこそ命の恩人だ

C# - NLog.Extensions.Logging

NLog.Extensions.Logging

github.com

  • .NET 用のログ出力ライブラリ。
  • Microsoft の方が勤務時間外に開発したものらしい。
  • Nuget より "Microsoft.Extensions.Hosting" をインストール。
    • 作成者:Microsoft、Julian Verdurmen
    • ダウンロード数:53.1M (2022/6時点)
    • ライセンス:BSD-2-Clause
    • 依存関係のあるライブラリ (一部、省略)
  • NLog.config をプロジェクトに追加。
    • Nuget の NLog.Config は非推奨との記載あり。
    • プロパティで "新しい場合はコピーする" を選択。
    • 以下、config の例。
<?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">

    <variable name="logPath" value="${basedir}/Log/" />
    <variable name="logWord" value="SampleLog" />
    <variable name="logName" value="${logPath}${logWord}.tsv" />
    <variable name="appName" value="Sample" />

    <targets async="true">
        <target
          name="logfile"
       xsi:type="File"
          encoding="UTF-8"
          fileName="${logName}"
          archiveFileName="${logPath}OldLogs/${logWord}_{##########}.zip"
          archiveAboveSize="10000000"
          maxArchiveFiles="100"
          archiveNumbering="Sequence"
          archiveEvery="None"
          archiveOldFileOnStartup="true"
          enableArchiveFileCompression="true">
            <layout xsi:type="CsvLayout" delimiter="Tab" withHeader="false">
                <column name="time" layout="${date:format=yyyy-MM-ddTHH\:mm\:ss.fffK}" />
                <column name="level" layout="${level:padding=-5}"/>
                <column name="processname" layout="${appName} " />
                <column name="threadid" layout="${threadid:padding=4}" />
                <column name="message" layout="${replace-newlines:replacement=&lt;br&gt;:${message:format=ToString}}"/>
                <column name="callsite" layout="${callsite}#${callsite-linenumber}" />
                <column name="stacktrace" layout="${stacktrace:topFrames=10}" />
                <column name="exception" layout="${replace-newlines:replacement=&lt;br&gt;:${exception:format=ToString}}"/>
            </layout>
        </target>
    </targets>

    <rules>
        <logger name="*" minlevel="Debug" writeTo="logfile" />
    </rules>
</nlog>

ロガーの利用方法

static オブジェクトの利用

LogManager.SetLoggerFactory(new NLogLoggerFactory());

var sample = new Class1();
// カレントにログファイルが生成されたことを確認。

汎用ホストの利用

  • DI によりロガーを取得する。
    • Nuget より "Microsoft.Extensions.Hosting" をインストール
  • AddNLog メソッドで追加できる。
    • NLog.config のファイルパスを設定する。
public class Class1
{
    public Class1(ILogger<Class1> logger)
    {
        logger.LogInformation("お試し (^^♪");
    }
}
IHost host = Host.CreateDefaultBuilder(args)
    .ConfigureLogging((hostContext, loggingBuilder) =>
    {
        loggingBuilder.ClearProviders();
        
        // NLog.config のファイルパスを設定
        loggingBuilder.AddNLog(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "NLog.config"));
    })
    .ConfigureServices(services =>
    {
        services.AddTransient<Class1>();
    })
    .Build();

var sample = host.Services.GetService<Class1>();
// カレントにログファイルが生成されたことを確認。

NLog.Config の設定方法

Configuration file · NLog/NLog Wiki · GitHub

targets タグ

Targets · NLog/NLog Wiki · GitHub

xsi:type

Config | NLog

xsi:type="File" 用のパラメータ

xsi:type="File" で使用するパラメータの一例を以下に記載する。

name

  • ターゲット名。
  • rules への関連付けに使用する。

fileName

  • 出力ファイル名。

layout

  • 出力項目のレイアウト。

archiveAboveSize

  • ログサイズが指定バイトに到達すればアーカイブされる。
  • 単位はバイト。例えば10MBを上限にするなら、10000000に設定する。

maxArchiveFile

  • アーカイブファイルの上限数。
  • 例えば、maxArchiveFiles="3"にした場合、4ファイル目が生成された時点で、最も古いファイルが削除される。

archiveOldFileOnStartup

  • true の場合、起動時に旧ファイルがアーカイブされる。
  • false の場合、起動時に旧ファイルがアーカイブされない。
  • 既定 : false

archiveNumbering

  • アーカイブ方法。
  • Rolling
    • アーカイブファイル名が全て修正される。
    • 0が最新になる。
  • Date
    • アーカイブファイル名が日付で出力される。
    • 古いファイルと同名なら上書きされる。
  • Sequence
    • 新しい数値が採番される。
  • DateAndSequence
    • アーカイブファイル名が日付+シーケンスNo.で出力される。

ArchiveEvery

  • アーカイブのタイミング。
  • ArchiveEveryを使用する場合、ファイル名は静的にする必要がある。日付を含める etc. 動的なファイル名にしないこと。

enableArchiveFileCompression

  • true の場合、zipファイルを生成できる。
  • false の場合、拡張子zipのファイルは生成されるが、解凍はできないし、trueとサイズ比較すると、圧縮されてない様子。
  • 同じ処理のログファイルサイズ、true->5KB、false:800KB だった。圧縮効率も良いみたい。

rules タグ

https://github.com/nlog/nlog/wiki/Configuration-file#rules

パラメータ名 内容
name ロガーの名称( ワイルドカード * でも良い )
minlevel 最小のログレベル
writeTo ターゲット名 ( ターゲットの設定に従ってログ出力される )

補足

NLog.Config の初期状態

<?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"
      xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
      autoReload="true"
      throwExceptions="false"
      internalLogLevel="Off" internalLogFile="c:\temp\nlog-internal.log">

  <!-- optional, add some variables
  https://github.com/nlog/NLog/wiki/Configuration-file#variables
  -->
  <variable name="myvar" value="myvalue"/>

  <!--
  See https://github.com/nlog/nlog/wiki/Configuration-file
  for information on customizing logging rules and outputs.
   -->
  <targets>

    <!--
    add your targets here
    See https://github.com/nlog/NLog/wiki/Targets for possible targets.
    See https://github.com/nlog/NLog/wiki/Layout-Renderers for the possible layout renderers.
    -->

    <!--
    Write events to a file with the date in the filename.
    <target xsi:type="File" name="f" fileName="${basedir}/logs/${shortdate}.log"
            layout="${longdate} ${uppercase:${level}} ${message}" />
    -->
  </targets>

  <rules>
    <!-- add your logging rules here -->

    <!--
    Write all events with minimal level of Debug (So Debug, Info, Warn, Error and Fatal, but not Trace)  to "f"
    <logger name="*" minlevel="Debug" writeTo="f" />
    -->
  </rules>
</nlog>



以上