developers blog

Template Studio for WPFで作成したプロジェクトへのログ出力の追加

Template Studio for WPFのテンプレートでMVVM Toolkitを選択して作成したプロジェクトに外部ファイルへのログ出力を追加する場合のメモ。
テンプレートを使用した場合、Generic Hostが設定されているためそれを利用する。

NuGetパッケージの追加

外部ファイルにログを出力するために、Serilogを使用。NuGetで以下のパッケージをインストールする。

  • Serilog
  • Serilog.Extentions.Hosting
  • Serilog.Sinks.File
  • Microsft.Extentions.Logging

アプリ内でログの出力構成を設定する場合

App.xaml.csファイルを開き、ConfigureLoggingを追加する。アプリと同じ場所にlog[日付].txtというログファイルを出力する場合は以下のように設定する。

App.xaml.cs
1    private async void OnStartup(object sender, StartupEventArgs e) {
2      var appLocation = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
3
4      _host = Host.CreateDefaultBuilder(e.Args)
5              .ConfigureAppConfiguration(c => {
6                c.SetBasePath(appLocation);
7              })
8              .ConfigureServices(ConfigureServices)
9              .ConfigureLogging((context, builder) => {
10                builder.ClearProviders();
11
12                var _logger = new LoggerConfiguration()
13                  .WriteTo.File("log.txt", rollingInterval: RollingInterval.Day)
14                  .CreateLogger();
15
16                builder.AddSerilog(_logger);
17              })
18              .Build();
19
20      await _host.StartAsync();
21    }

出力構成を外部ファイルで設定する場合

appsettings.jsonファイルを使用して、環境によって構成を変える場合は以下のように設定する。

NuGetで以下のパッケージを追加インストールしておく。

  • Serilog.Settings.Configuration

ConfigurationBuilderでappsettings.jsonファイルを読み込み、LoggerConfigurationに読み込ませる。

App.xaml.cs
1    private async void OnStartup(object sender, StartupEventArgs e) {
2      var appLocation = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
3
4      _host = Host.CreateDefaultBuilder(e.Args)
5              .ConfigureAppConfiguration(c => {
6                c.SetBasePath(appLocation);
7              })
8              .ConfigureServices(ConfigureServices)
9              .ConfigureLogging((context, builder) => {
10                builder.ClearProviders();
11
12                var configuration = new ConfigurationBuilder()
13                  .SetBasePath(Directory.GetCurrentDirectory())
14                  .AddJsonFile("appsettings.json")
15                  .Build();
16
17                var _logger = new LoggerConfiguration()
18                  .ReadFrom.Configuration(configuration)
19                  .CreateLogger();
20+
21                builder.AddSerilog(_logger);
22              })
23              .Build();
24
25      await _host.StartAsync();
26    }

appsettings.jsonファイルには以下のように設定する。

appsettings.json
1{
2  "Serilog": {
3    "Using": [ "Serilog.Sinks.File" ],
4    "WriteTo": [
5      {
6        "Name": "File",
7        "Args": {
8          "path": "log.txt",
9          "rollingInterval": "Day"
10        }
11      }
12    ]
13  }
14}