2023年3月24日金曜日

レイアウトのカスタマイズーNLogでログを出力する②


こんにちは。せんです。 

今回も前回に引き続き、NLogを使用したログ出力についてまとめていきます。

(前回の内容)インストール、基本設定、出力

今回のテーマは「レイアウトの編集」です。



前回の出力結果を確認します。


まずは、前回の設定でどのようにログが出力されたか振り返ってみましょう。
App.configは前回のままです。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
	<configSections>
		<section name="nlog" type="NLog.Config.ConfigSectionHandler, NLog"/>
	</configSections>
	<startup>
		<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
	</startup>
	<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
		  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
		<targets>
			<target name="logFile"
				xsi:type="File"
				encoding="UTF-8"
				fileName="logs/${processname}.log"
				layout="${date} [${level}] -${message}" />
		</targets>
		<rules>
			<logger name="*" minlevel="Info" writeTo="logFile" />
		</rules>
	</nlog>
</configuration>

Program.csは少し変更しています(例外をキャッチします)。
using System.Security.AccessControl;
using System.Text;
using System.Threading.Tasks;
using NLog;

namespace UseNLogSample
{
    public class Program
    {
        private static Logger logger = LogManager.GetCurrentClassLogger();

        static void Main(string[] args)
        {
            logger.Info("NLogでinformationログを出力します。");
            logger.Warn("NLogでwarningログを出力します。");

            var companions = new string[] { "inu", "saru", "kiji" };

            try
            {
                Console.WriteLine(companions[3]);
            }
            catch (Exception ex)
            {
                logger.Error(ex, "NLogでerrorログを出力します。");
            }
        }
    }
}

これを実行すると、logsフォルダにUseNLogSample.logが生成されます。
その内容はこんな感じです。


これを見ると、なんとなくこう思います。
・ちょっと日付フォーマットを変えたいなあ...
・メッセージの先頭位置を揃えたいなあ...
・IndexOutOfRangeExceptionが発生しているはずなんだけど、これだとわからないなあ...

というわけで、
layout="${date} [${level}] -${message}"
の部分を編集し、いろんなパターンを出力して確認していきます!!!


日時フォーマットを変更してみる


公式ドキュメントのLayout renderersタブを確認すると、Date and timeという項目があります。


先に使用した${date}のほかに4つのパターンがあったので、それぞれ出力してみました。
①${longdate}


②${shortdate}


③${ticks}

④${time}


また、Date and timeの各レンダラーには次のようなパラメータも用意されています。
・universalTime(${ticks}以外):UTC時間を出力
・format(${date}のみ):日付形式を指定
 etc

ここでは2つ目のformatを使って以下のように編集してみます。
layout="${date:format=yyyyMMdd HH\:mm\:ss,fffff} [${level}] -${message}"


➥年月日がyyyyMMdd形式で表示され、ミリ秒が5桁表示されていることがわかります。


ログレベルのフォーマットを変更してみる


それでは次に、ログレベルの部分を見ていきます。

App.configのrules要素にターゲットごとのログレベルが指定できることを先に確認しておきます。
<rules>
	<logger name="*" minlevel="Info" writeTo="logFile" />
</rules>


ログレベルに関する変更は
・すべて大文字で表示する
・5文字幅で、左詰め表示する
の2点です。

まず、すべて大文字で表示するには、パラメータuppercaseをtrueに設定します。
${level:uppercase=true}
と記述します。


➥大文字表記に変わりました。


次に、5文字幅で左詰めします。
この際にはパラメータpaddingを使用します。
公式の通り、padding=(正の数)に設定すると左側が空文字で埋まります(→右詰め)。
padding=(負の数)に設定すると右側が空文字で埋まります(→左詰め)。

というわけで
${level:uppercase=true:padding=-5}
と記述し、実行します。


➥左詰めできたことが確認できます。


ちなみに、公式ドキュメントを確認すると、formatというパラメータもあったので、
${level:uppercase=true:padding=-5:format=FullName}
と書くとどうなるか見てみました。


➥フルネーム表示にしたので、見た目を整えるにはpadding幅の再設定が必要ですね。


メッセージとスタックトレース


例外の内容を出力する方法は大きく二通りあります。
①messageのパラメータwithExceptionをtrueにする
②exceptionレンダラーを使用する

①${message:withException=true}



②${message} ${exception}


➥「❘」で区切られていること以外は同じ内容です。
 私は今回${exception}としたところを今まで${exception:format=tostring}と書いていたんですが、結果は変わらないですね...
 場合によっては違いが出るかもしれないです。


まとめ


ここまで、レイアウトをカスタマイズしながら出力内容を確認してきました。

ちなみに、App.configにレイアウトの属性ごと書かないという方法もあります。
デフォルトの設定はこちらに説明がありますが、出力すると


こんな感じです。

次回はアーカイブとローリングの設定を行っていきます。
ありがとうございました。



0 件のコメント:

コメントを投稿