我无法找到任何适用于Windows 10通用应用程序的记录器,我尝试了log4net、Microsoft企业库和Nlog等工具,但它们都不支持Windows 10通用平台。
有人能为Windows 10 UWP建议一个好的记录器吗?
我无法找到任何适用于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找到一个教程,解释如何在您的项目中添加它。另外也有关于检索这些日志的说明。
FileStreamingTarget
已经过时。建议使用 StreamingFileTarget
替代。 - tomab使用Serilog作为中央日志接口的一种可能性,并配置一个与UWP兼容的Sink。
您可以使用众多提供的Sinks之一,也可以选择通过实现自定义sink来使用自己的日志基础设施。
为了使其更加有用,您可以使用Anotar.Serilog.Fody来使用Fody Code Weaver并使用Aspects使您的日志记录变得轻松。
通常,您需要使用一个中央日志提供程序进行应用程序生命周期管理(ALM),以及一个本地sink(文件)作为致命错误的后备。
MetroLog是在ETW和LocalState之上构建的简单日志基础架构。它快速且易于实施,但不支持集中式日志记录,因此无法帮助您进行ALM。
通用Windows平台日志记录相对较新,仅适用于Windows 10和Windows Server 2016。您可以选择ETW和LocalStorage之间进行选择。它为您提供了对日志记录外观的大多数低级控制,但自然也需要最多的实施工作并且缺少ALM功能。
如果你想要记录到文件并且利用微软的轻量级DI框架,你可以使用Serilog。
在Nuget包管理器控制台中输入以下内容:
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\你的用户名\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)
我所了解的唯一解决方案是使用windows.foundation.diagnostics命名空间中的API进行ETW跟踪。
微软提供了这里的示例。
您可以在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();
}
```