Windows 10ユニバーサルアプリのロガーが見つかりませんでした。log4net、Microsoftエンタープライズライブラリ、Nlogを試しましたが、Windows 10ユニバーサルプラットフォームではサポートされていません。
Windows 10 UWPに適したロガーを提案できますか?
MetroLogを試しましたか? NuGetを使用してインストールできます。
Install-Package MetroLog
以下に簡単な例を示します。
using MetroLog;
using MetroLog.Targets;
LogManagerFactory.DefaultConfiguration.AddTarget(LogLevel.Trace, LogLevel.Fatal, new FileStreamingTarget());
ILogger log = LogManagerFactory.DefaultLogManager.GetLogger<MainPage>();
log.Trace("This is a trace message.");
http://talkitbr.com/2015/06/11/adicionando-logs-em-universal-apps でプロジェクトに追加する方法を説明したチュートリアルを見つけることができます。また、これらのログの取得に関する説明もあります。
可能性の1つは、 Serilog を中央のロギングインターフェイスとして使用し、UWPで動作するシンクを持つように構成することです。
多くの 選択可能なシンク のいずれかを使用できますが、カスタムシンクを実装して独自のログインフラストラクチャを使用することもできます。
さらに便利にするには、 Anotar.Serilog.Fody を使用して Fody Code Weaver を使用し、アスペクトを使用してロギングを簡単にします。
通常、致命的なエラーのフォールバックとしてローカルシンク(ファイル)と同様に、アプリケーションライフサイクル管理(ALM)の中央ログプロバイダーを使用します。
MetroLog は、ETWおよびLocalStateの上にあるシンプルなロギングインフラストラクチャです。これは高速で簡単に実装できますが、集中ロギングがサポートされていないため、ALMには役立ちません。
niversal Windows Plattform Logging は比較的新しく、Windows 10とWindows Server 2016でのみ可能です。ETWとLocalStorageのどちらかを選択できます。これにより、ログがどのように表示されるかについて最も低レベルの制御が可能になりますが、当然ながら、ほとんどの作業が実装され、ALM機能もありません。
私が知っている唯一の解決策は、windows.foundation.diagnostics名前空間のAPIを使用してETWトレースを行うことです。
また、Microsoftはサンプル here を提供しています。
ファイルにログを記録し、Microsoftの軽量DIフレームワークを利用したい場合は、Serilogを使用できます。
Nuget Package Managerコンソールで、次を入力します。
Install-Package Microsoft.Extensions.DependencyInjection
Install-Package Microsoft.Extensions.Logging
Install-Package Serilog.Extensions.Logging.File
コンポジションのルートで依存性注入コンテナーをセットアップします。この例では、App.xaml.csファイルのOnLaunchedメソッドです。
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Windows.Storage;
...
protected override void OnLaunched(LaunchActivatedEventArgs e)
{
...
// Create IOC container and add logging feature to it.
IServiceCollection services = new ServiceCollection();
services.AddLogging();
// Build provider to access the logging service.
IServiceProvider provider = services.BuildServiceProvider();
// UWP is very restrictive of where you can save files on the disk.
// The preferred place to do that is app's local folder.
StorageFolder folder = ApplicationData.Current.LocalFolder;
string fullPath = $"{folder.Path}\\Logs\\App.log";
// Tell the logging service to use Serilog.File extension.
provider.GetService<ILoggerFactory>().AddFile(fullPath);
...
}
一度設定すれば、ロギングは非常に簡単です。クラスにロガーを挿入するだけです。
using Microsoft.Extensions.Logging;
class MyClass
{
readonly ILogger<MyClass> logger;
public MyClass(ILogger<MyClass> logger)
{
this.logger = logger;
logger.LogInformation("Hello from MyClass.");
}
}
ログファイルは次の場所に作成する必要があります。
C:\ Users\yourUserName\AppData\Local\Packages\f15fdadf-faae-4f4a-8445-5feb195ff692_68newbw0j54vy\LocalState\Logs\App-20171206.log、
ここで、f15fdadf-faae-4f4a-8445-5feb195ff692_68newbw0j54vyは、私のソリューションのPackage.appxmanifestファイルのパッケージ名です。
AppDataフォルダーはデフォルトでエクスプローラーで非表示になっていることに注意してください。
そして、その内容は次のとおりです。
2017-12-06T17:06:33.1358005-06:00 [INF] Hello from MyClass. (25278b08)
UWPで標準のSerilogローリングファイルシンクを使用できます。ログを記録する場所をロガーに指示するだけです。これを設定するコードをいくつか示します(私はAutofacを使用しています)。
private static void RegisterLogger(ContainerBuilder builder)
{
const string fileOutputTemplate = "{Timestamp:yyyy-MM-dd HH:mm:ss.fff} [{Level}] {Message}{NewLine}{Exception}";
var logPath = Path.Combine(ApplicationData.Current.LocalFolder.Path, "Logs", "MyAppName-{Date}.log");
var logConfiguration = new LoggerConfiguration()
.MinimumLevel.Verbose()
.WriteTo.RollingFile(logPath, outputTemplate: fileOutputTemplate);
Log.Logger = logConfiguration.CreateLogger();
builder.RegisterLogger();
}
`` `