こんにちは、たびとです。
前回は Windows で Visual Studio 2019 を使って、NLog を使ったログ出力のプログラムを作りました。
このプログラムは .NET Core で作ったので、Linux 環境でも動作します。 今回は、このプログラムを WSL2/Ubuntu にコピーして、本当に動作するのかを確認します。
この記事の対象者
- NLog(ロギングユーティリティ)に興味のある方、使ってみたい方
- Visual Studio でクロスプラットフォーム開発をやっている方、これからやりたい方
- Linux で実行中のアプリのログを Windows 側で確認したい方
Windows のプロジェクトファイルを Ubuntu にコピーする
Windows 11 の場合、Ubuntu をインストール済みであれば、 エクスプローラに Linux アイコンが表示されているので、 インストール時に作成したアカウントのホームを開きます。
Windows 10 の場合、PowerShell またはコマンドラインを起動し、以下のコマンドを入力して、 Ubuntu アカウントのホームへ移動してください。
PS C:\> start \\wsl$
次に前回作成した NLogSample のディレクトリを開きます。
ディレクトリを指定していなければ、C:\Users\ユーザ名\source\repos
配下に格納されています。
この NLogSample を先ほどの 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 に送るために、Windows のIPアドレスをを調べます。 Windows 11 の場合、Windows ボタン右クリックし、「Windows ターミナル」を選択します。 Windows 10 の場合、PowerShell または コマンドプロントを起動します。
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 のエディタが苦手な場合、Windows の Visual 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 を確認すると、同じように表示されていることが確認できます。
NLog と Log2Console を合わせると、Docker 上で ASP.NET Core アプリや Cronで実行させている .NET Core コンソールアプリケーションのログも Windows 側の Log2Console に出力することができるため、 デバッグが非常に楽になります。
Log2Console に興味のある方は以前の記事も参考にしてください。
ただし、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 を使って開発する方法をよく見かけます。
たびとも、Windows と Linux の両方で動作するクロスプラットフォーム開発をやったときは、 Ubuntu 側でプロジェクトまたはソリューションを作成し、GitHub 経由で Windows で動作確認してました。
最後に参考サイトを掲載しておきます。
では、皆さん、よい旅を。