RazorページでのNLogとxunitの使用


.net6の情報が出ていたので、nlogのサンプルを書き直しました。
xUnitと併せてのサンプルです

.NET 6.0 C# Razor
NLog4.7.15
NLog.Web.AspNetCore4.14.0
xunit2.4.1

公式がgithubに記載している以外では
https://github.com/NLog/NLog/wiki/Getting-started-with-ASP.NET-Core-6

[5. Write logs]でControllerから取得しているのですが、
ここでは、Razorを使いたいので、PageModelをつかってます

共通で使用するクラスとかでログ出力するとき

中規模以上のシステムになると、共通でつかうクラスが出てきますが、
ログを出力したいとなると、Modelで取得したLoggerを引っ張りまわすか、その場で生成するという手法が考えられます

Loggerを引っ張りまわすときに呼び出し元のModel名だと都合が悪いので、一回PageModelに型変換すると予備先で楽になります

xUnitで単体テストするときに

xUnitから呼び出す時に、下記の問題がありまして
Razor Pageで、nlogを使うと、コンテキストからloggerをもらうので、
xUnitでログを出力するところがテストできてないです。
ものすごく頑張ればモデルを作れるハズみたいです(下の方のソースにindexModelをつくってる)
https://docs.microsoft.com/en-us/aspnet/core/test/razor-pages-tests?view=aspnetcore-3.1

解決策としては、
ログはエラーハンドリング系にだけに入れておき、xUnitで生成時にILoggerなどにはnullを設定して
どうしてもログ出力を通過する個所については、コンパイル時にシンボル指定して回避する

共通処理等でまとめPageModelから遠いクラスでのエラーハンドリングとかでは、
個別にlogerを生成したほうがコーディング量は減るかもしれないです
ログファイルへの出力の場合はファイルへの書き込み待ちが発生するので推奨できないですが、
ログ専用にsyslogサーバーなどを別途立ててxml,jsonもしくはキュー、クエリでログを投げる場合は良いと思います

今回作成したプロジェクト

https://www.6sense.co.jp/dl/nlog_test_net60_v2.zip

EU 一般データ保護規則(GDPR)対策

GDPR対策をしないといけない状況なので、簡単な物を書きました
eu圏外でも、該当ドメインは取得できるが、都度判断するのは、運用的にみても、コストがかかりますので、
初めからはじいてリスク回避するならば、EUをサービス対象外にする事も考慮に入れた法は良いです
その辺はリスクヘッジをどうするのかの経営判断でしょうか

あと、スイス連邦データ保護法改正案も制裁金が高額なので、検討すべきです
https://www.jetro.go.jp/world/europe/eu/gdpr/

スイス連邦データ保護法改正案
https://www.jetro.go.jp/world/reports/2018/01/74c0fb55f759d238.html

メールアドレスの国別コードトップレベルが、EUなのかを判定する為の簡単なメソッド
c# ASP.NET6.0 Razorで作成してます。

https://www.6sense.co.jp/dl/eu_filter.zip

ASP.NET6.0 Razor でのPageHandla周りのコーティングについて

submitボタンを複数使いたいときのサンプルです

cshtml側の記載

asp-page-handlerに指定する

cshtml.cs側の記載

OnPostの後ろにasp_page_handlerで指定した物をくっつけるとハンドリングできます

ついでにBindPropertyの有り無しの取り扱いもサンプルに入れました
BindPropertyを使うと引数の定義をしなくても、
メソッドの中で扱えるので、楽になります

今回作成したプロジェクト一式

https://www.6sense.co.jp/dl/PageHandler_test.zip

c# Razor .net6にて、NLogでのログ出力

.net6になってから、start.csが廃止されて、program.csも中身が変わったこともあって、
サイトを調べても情報がないので、2時間ほど、挑戦して出るようになったので、ここにメモっておく

環境
visual studio2022
razor
.net6
Nlog 4.7.13
Nlog.Web.AspNetCore 4.14.0

1.NuGetでNLogをインストール
visual studio2022のツールからNlogとNlog.Web.AspNetCoreの最新をインストールする

2.nlog.configを用意する


とりあえず、転がってたのをそのまま使います。

参考はこれ

https://github.com/NLog/NLog/wiki/Getting-started-with-ASP.NET-Core-2


3.Program.csを変更する

.net6でプロジェクトを新規作成すると、デフォルトでbuilderが定義されているので、追加で、builderに設定を加えます。

var app = builder.Build();よりも前に記載しないと実行時エラーになります

cs0618で警告が出ますが、新しい書き方だと、.net6じゃない気がします

4.appsettings.jsonを少し変更する

これもとりあえず、転がってたのをそのまま使います。

参考は上記記載と同じgithub

https://github.com/NLog/NLog/wiki/Getting-started-with-ASP.NET-Core-2

5.Index.cshtml.csに出力するコードを試しに記載する

6.実際に動かして、出力されるのかを確認

info-2022-02-03.logの中身

infoレベルの中に、infoとerrorの両方出るのですね。errorしか使わないと思いますが。

azure上で動かしたときに、どうなるのかも見てみたいです

今回作成したプロジェクト一式

https://www.6sense.co.jp/dl/nlog_test.zip

2022/4/1追記 追加修正情報があったので、別途公開