砂漠の旅人(たびと)

UNIX / MS-DOS 時代から電脳砂漠を旅しています

【Linux版】C#でNLogを使ってログを出力する

こんにちは、たびとです。

前回は WindowsVisual Studio 2019 を使って、NLog を使ったログ出力のプログラムを作りました。

sabakunotabito.hatenablog.com

このプログラムは .NET Core で作ったので、Linux 環境でも動作します。 今回は、このプログラムを WSL2/Ubuntu にコピーして、本当に動作するのかを確認します。

この記事の対象者

Windows のプロジェクトファイルを Ubuntu にコピーする

Windows 11 の場合、Ubuntu をインストール済みであれば、 エクスプローラLinux アイコンが表示されているので、 インストール時に作成したアカウントのホームを開きます。

Ubuntu アカウントのホームを開く画面
Ubuntu アカウントのホームを開く

Windows 10 の場合、PowerShell またはコマンドラインを起動し、以下のコマンドを入力して、 Ubuntu アカウントのホームへ移動してください。

PS C:\> start \\wsl$

次に前回作成した NLogSample のディレクトリを開きます。 ディレクトリを指定していなければ、C:\Users\ユーザ名\source\repos 配下に格納されています。

前回作成した NLogSample のプロジェクトを開く画面
前回作成した NLogSample のプロジェクトを開く

この NLogSample を先ほどの Ubuntu のホーム配下にコピー&ペーストします。

Windows から Ubuntu へコピー&ペーストする画面
Windows から Ubuntu へコピー&ペーストする

Ubuntu を起動し、ファイルがコピーされたことを確認します。 Ubuntu インストール時に最初に作成したアカウントでないと、所有者が root になるので、 chown -R <ユーザ名>:<グループ名> NLogSample コマンドで所有者を変更してください。

$ ls -l
total 4
drwxr-xr-x 4 tabito tabito 4096 Nov  6 17:11 NLogSample

これで、プロジェクトのコピーは終了です。

Ubuntu で NLogSample を実行する

先ほどコピーした NLogSample を Ubuntu 環境で実行します。

Ubuntu .NET SDK をインストールする

既に Ubuntu .NET SDK をインストール済みの方は、スキップして次へ進んでください。 Microsoft パッケージ署名とパッケージリポジトリを追加します。

$ wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
$ sudo dpkg -i packages-microsoft-prod.deb
$ rm packages-microsoft-prod.deb

.NET SDK をインストールします。 前回は、.NET 5 を使ってプログラムを作ったので、.NET 5 を選択します。

$ sudo apt update; \
  sudo apt install -y apt-transport-https && \
  sudo apt update && \
  sudo apt install -y dotnet-sdk-5.0

dotnet コマンドを入力し、メッセージが正しく表示されることを確認します。

$ dotnet

Usage: dotnet [options]
Usage: dotnet [path-to-application]

Options:
  -h|--help         Display help.
  --info            Display .NET information.
  --list-sdks       Display the installed SDKs.
  --list-runtimes   Display the installed runtimes.

path-to-application:
  The path to an application .dll file to execute.

これで、.NET SDK のインストールは完了です。

dotneto コマンドで NLogSample を実行する

いよいよ、NLogSample を実行していきます。 まずは、dotnet コマンドを実行できるディレクトリに移動します。

$ cd ./NLogSample/NLogSample

拡張子 csproj のプロジェクトファイルがあることを確認します。

$ ls
NLog.config  NLogSample.csproj  Program.cs  bin  obj

dotnet run コマンドでプロジェクトファイルを実行します。

$ dotnet run
2021-11-06 19:34:13.4325 TRACE Trace ログです。
2021-11-06 19:34:13.4899 DEBUG Debug ログです。
2021-11-06 19:34:13.4899 INFO  Info ログです。
2021-11-06 19:34:13.4899 WARN  Warn ログです。
2021-11-06 19:34:13.4899 ERROR Error ログです。
2021-11-06 19:34:13.4899 FATAL Fatal ログです。
2021-11-06 19:34:13.4925 ERROR エラーが発生しました。

Windows で作成した .NET 5 のプログラムが Ubuntu 環境でも同じように実行できました。

ちなみに、拡張子 sln のソリューションファイルがあるディレクトリで実行すると、 エラーが表示されます。

$ dotnet run
Couldn't find a project to run. Ensure a project exists in /home/tabito/NLogSample, or pass the path to the project using --project.

NLog の出力を確認する。

NLog の出力されたディレクトリに移動し、ログファイルの内容を確認します。

$ cd ./bin/Debug/net5.0/logs/
$ cat NLogSample.log
<feff>2021-11-06 19:34:13.4325 TRACE [1] NLogSample.Program.Main Trace ログです。
2021-11-06 19:34:13.4899 DEBUG [1] NLogSample.Program.Main Debug ログです。
2021-11-06 19:34:13.4899 INFO  [1] NLogSample.Program.Main Info ログです。
2021-11-06 19:34:13.4899 WARN  [1] NLogSample.Program.Main Warn ログです。
2021-11-06 19:34:13.4899 ERROR [1] NLogSample.Program.Main Error ログです。
2021-11-06 19:34:13.4899 FATAL [1] NLogSample.Program.Main Fatal ログです。
2021-11-06 19:34:13.4925 ERROR [1] NLogSample.Program.Main エラーが発生しました。 System.DivideByZeroException: Attempted to divide by zero.
   at NLogSample.Program.Main(String[] args) in /home/tabito/NLogSample/NLogSample/Program.cs:line 21

Windows と同様のログが出力されていることが確認できます。

ただし、エラー時のファイルパスが Ubuntuディレクトリ構造に変更されています。 実際にクロスプラットフォームな開発を行う場合、このディレクトリ構造の違いは考慮する必要があります。

Log2Console でログの内容を確認する

Windows と同じように Log2Console への出力結果も確認します。 Log2Console は NLogSample の実行前に起動しておく必要があります。

まずは、Ubuntu から Windows に送るために、WindowsIPアドレスをを調べます。 Windows 11 の場合、Windows ボタン右クリックし、「Windows ターミナル」を選択します。 Windows 10 の場合、PowerShell または コマンドプロントを起動します。

Windows ボタンを右クリックし、Windows ターミナルを選択する画面
Windows ボタンを右クリックし、Windows ターミナルを選択する

ipconfig コマンドを実行します。

PS C:\> ipconfig

Windows IP 構成


イーサネット アダプター イーサネット:

   接続固有の DNS サフィックス . . . . .: mshome.net
   リンクローカル IPv6 アドレス. . . . .: fe80::c441:9249:4a11:3714%3
   IPv4 アドレス . . . . . . . . . . . .: 172.18.175.105
   サブネット マスク . . . . . . . . . .: 255.255.240.0
   デフォルト ゲートウェイ . . . . . . .: 172.18.160.1

LANケーブルを使った有線接続の場合は「イーサネット」、無線LANによる接続の場合は「Wi-Fi」の IPv4 アドレスの値を利用します。上記の場合は「 172.18.175.105 」となります。

Ubuntu 上で vi や nano などのエディタで NLog.config を開きます。

$ cd ~/NLogSample/NLogSample
$ vi NLog.config

どうしても、Linux のエディタが苦手な場合、WindowsVisual Studio Code を使ってください。 インストール後は、Ubuntu のコンソールから code コマンドで実行します。

Visual Studio Code インストール後、拡張機能「Remote - WSL」をインストールすると、 Ubuntu版の C# のインストールが可能となり、インストールすると 拡張機能C#の詳細に「拡張機能は 'WSL: Ubuntu' で有効です」と表示されます。 この状態であれば、Visual Studio Code で開発することができるようになります。

$ code NLog.config

target NLogViewer の個所の localhost を ipconfig の IPv4アドレスに変更します。

 <target name="tcpOutlet" xsi:type="NLogViewer" address="tcp4://localhost:4505"/>

※ localhost の個所を ipconfig で確認した IPv4 アドレスに変更する。

 <target name="tcpOutlet" xsi:type="NLogViewer" address="tcp4://172.18.175.105:4505"/>

再度、NLogSample を実行します。

$ dotnet run
2021-11-06 20:09:06.4628 TRACE Trace ログです。
2021-11-06 20:09:06.5164 DEBUG Debug ログです。
2021-11-06 20:09:06.5164 INFO  Info ログです。
2021-11-06 20:09:06.5383 WARN  Warn ログです。
2021-11-06 20:09:06.5494 ERROR Error ログです。
2021-11-06 20:09:06.5602 FATAL Fatal ログです。
2021-11-06 20:09:06.5715 ERROR エラーが発生しました。

Log2Console を確認すると、同じように表示されていることが確認できます。

Log2Console へのログ出力を確認する画面
Log2Console へのログ出力を確認する

NLog と Log2Console を合わせると、Docker 上で ASP.NET Core アプリや Cronで実行させている .NET Core コンソールアプリケーションのログも Windows 側の Log2Console に出力することができるため、 デバッグが非常に楽になります。

Log2Console に興味のある方は以前の記事も参考にしてください。

sabakunotabito.hatenablog.com

ただし、Log2Console は1秒に大量のログを吐き出すようなプログラムの場合、 全部のログを取得できない場合があるため、注意してください。 たびとのマシン( 11th Gen Intel(R) Core(TM) i7-1165G7 )は、なかなか全ての行が Log2Console に 出力されず、Windows版とUbuntu版共に何度もリテイクしています (最初から Sleep でウェイト入れとけばよかった)。

まとめ

今回は、前回 .NET 5 を使って作成した NLogSample をそのまま Ubuntu にコピーし、 正しく動作するのかを検証してみました。 今回は簡単なプログラムだったので、ソースコードを変更することなく正常に動作しました。

通常は、dotnet new コマンドでプロジェクトを作成し、Visual Studio Code を使ってプログラムを作成し、 NuGet によるパッケージ追加もデバッグVisual Studio Code を使って開発する方法をよく見かけます。

たびとも、WindowsLinux の両方で動作するクロスプラットフォーム開発をやったときは、 Ubuntu 側でプロジェクトまたはソリューションを作成し、GitHub 経由で Windows で動作確認してました。

最後に参考サイトを掲載しておきます。

では、皆さん、よい旅を。

参考サイト