昨日の投稿「ASP.NET Core 可視化ログコンポーネントの使用」(記事を読む、動画を見る)に続き、動画のコメントで 「Winform クライアントのプログラムでも使えますか?」 という質問があり、WeChat でも WPF に移植できるかどうか聞かれました。サイト運営者が今朝試したところ、可能でした!

仕組みとしては、Winform または WPF アプリケーションを ASP.NET Core Web API 上でホストします。まずは短い動画で効果をご覧ください。コードが必要な方は下にスクロールしてください:
【動画プレースホルダ】
実践手順:
- WPF アプリケーションを作成する
ASP.NET Core、Serilogのサポートを追加する- WPF フォームで Serilog を使用する
- 完了
本記事の実践開始
1. WPF アプリケーションを作成する
VS 2019 を使用して、WPF アプリケーションプロジェクトを作成し、WPFWithLogDashboard という名前を付けます。本記事は .NET 6 ベースで構築します。
2. ASP.NET Core、Serilog のサポートを追加する
2.1 NuGet で関連パッケージをインストールする
Microsoft.Extensions.Hosting はバージョンを指定し、2.2.0 より上にしないでください:
Install-Package Microsoft.Extensions.Hosting -Version 2.2.0
Install-Package Serilog.AspNetCore
Install-Package LogDashboard
2.2 Serilog と ASP.NET Core を構成する
App.xaml.cs ファイルを開き、以下のコードを追加します。よく見ると、以下の設定は前回の記事の Program.cs ファイルの設定とほぼ同じで、主に Serilog を構成し、ログ出力の区切り文字に || を使用するように指定しています。
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;
using Serilog;
using Serilog.Events;
using System;
using System.Windows;
namespace WPFWithLogDashboard
{
/// <summary>
/// Interaction logic for App.xaml
/// </summary>
public partial class App : Application
{
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
#region Serilog構成
string logOutputTemplate = "{Timestamp:HH:mm:ss.fff zzz} || {Level} || {SourceContext:l} || {Message} || {Exception} ||end {NewLine}";
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Override("Default", LogEventLevel.Information)
.MinimumLevel.Override("Microsoft", LogEventLevel.Error)
.MinimumLevel.Override("Microsoft.Hosting.Lifetime", LogEventLevel.Information)
.Enrich.FromLogContext()
.WriteTo.Console(theme: Serilog.Sinks.SystemConsole.Themes.AnsiConsoleTheme.Code)
.WriteTo.File($"{AppContext.BaseDirectory}Logs/Dotnet9.log", rollingInterval: RollingInterval.Day, outputTemplate: logOutputTemplate)
.CreateLogger();
#endregion
Host.CreateDefaultBuilder(e.Args)
.UseSerilog()
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
}).Build().RunAsync();
}
}
}
Startup.cs ファイルを追加し、コードは以下の通りです:
using LogDashboard;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Serilog;
namespace WPFWithLogDashboard
{
public class Startup
{
private ILogger logger;
public ILogger MyLoger
{
get
{
if (logger == null)
{
logger = Log.ForContext<Startup>();
}
return logger;
}
}
public void ConfigureServices(IServiceCollection services)
{
MyLoger.Information("ConfigureServices");
services.AddLogDashboard();
services.AddControllers();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
MyLoger.Information("Configure");
app.UseLogDashboard();
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
}
}
このファイルでは、主に LogDashboard コンポーネントを追加し、.NET CORE Web API のルーティングを構成しています。
上記のコードを完了すると、Serilog と LogDashboard の両コンポーネントがインストールおよび構成済みになります:
- プログラム出力ディレクトリの Logs フォルダにログファイルが生成されます。
- ブラウザで以下の URL にアクセスすると、
LogDashboardの可視化ログパネルが開きます。
http://localhost:5000/logdashboard
3. WPF フォームで Serilog を使用する
メインフォーム MainWindow.xaml にいくつかのボタンを追加し、通常ログの追加、例外ログの追加、可視化ログパネルを開くための機能を実装します:
<Window
x:Class="WPFWithLogDashboard.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="WindowsでのSerilog使用"
Height="250"
Width="350"
>
<StackPanel Margin="20">
<button
Content="ログパネルを開く"
Width="100"
Height="35"
Click="OpenLogDashboard_Click"
/>
<button
Content="通常ログを追加"
Width="100"
Height="35"
Margin="0 20"
Click="AddInfoLog_Click"
/>
<button
Content="例外ログを追加"
Width="100"
Height="35"
Click="AddErrorLog_Click"
/>
</StackPanel>
</Window>
MainWindow.xaml.cs で上記の機能を実装します:
using Serilog;
using System.Diagnostics;
using System.Windows;
namespace WPFWithLogDashboard
{
public partial class MainWindow : Window
{
private ILogger logger;
public ILogger MyLoger
{
get
{
if (logger == null)
{
logger = Log.ForContext<MainWindow>();
}
return logger;
}
}
public MainWindow()
{
InitializeComponent();
MyLoger.Information("WPFフォームで記録されたログ");
}
private void AddInfoLog_Click(object sender, RoutedEventArgs e)
{
MyLoger.Information("Infoログ追加のテスト");
}
private void AddErrorLog_Click(object sender, RoutedEventArgs e)
{
MyLoger.Error("例外ログ追加のテスト");
}
private void OpenLogDashboard_Click(object sender, RoutedEventArgs e)
{
OpenUrl("http://localhost:5000/logdashboard");
}
private void OpenUrl(string url)
{
Process.Start(new ProcessStartInfo("cmd", $"/c start {url}")
{
UseShellExecute = false,
CreateNoWindow = true
});
}
}
}
OK、機能は完了しました。本記事は WPF ベースでプロジェクトを構築していますが、Winform プロジェクトテンプレートにも適用可能です。
4. 完了
本記事は実践に重点を置いています。ASP.NET Core について詳しくない場合は、マイクロソフトの公式ドキュメントで体系的に学習することをお勧めします。深く理解しなくても、記事のコードをそのままコピーしても構いません。
本記事はお役に立ちましたか?よろしければ「いいね」「シェア」「フォロー」をお願いします。
記事内のサンプルソースコード:https://github.com/dotnet9/TerminalMACS.ManagerForWPF/tree/master/src/Demo/WPFWithLogDashboard