我找不到Windows 10通用应用程序的任何记录器,我已经尝试过log4net,Microsoft企业库,Nlog但是在Windows 10 Universal平台上都没有支持它们。
有谁能建议我使用Windows 10 UWP的好记录器?
答案 0 :(得分:20)
你试过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 :(得分:13)
一种可能性是使用Serilog作为中央日志记录界面,并将其配置为具有与UWP一起使用的接收器。
您可以使用众多Sinks you can choose from中的一个,但您也可以通过实施自定义接收器来选择使用自己的日志记录基础结构。
为了使其更有用,您可以使用Anotar.Serilog.Fody来使用Fody Code Weaver并使用Aspects使您的日志记录变得微不足道。
通常,您希望将中央日志记录提供程序用于应用程序生命周期管理(ALM),并将本地接收器(文件)用作致命错误的后备。
MetroLog是ETW和LocalState之上的简单日志记录基础结构。这是快速且易于实现的,但它不能帮助您使用ALM,因为不支持集中式日志记录。
Universal Windows Plattform Logging相对较新,仅适用于Windows 10和Windows Server 2016.您可以选择ETW和LocalStorage。它为您提供了关于日志应如何显示的最低级别控制,但自然也导致了大部分工作的实现,也缺乏ALM功能。
答案 2 :(得分:4)
我所知道的唯一解决方案是使用windows.foundation.diagnostics命名空间中的API来执行ETW跟踪。
Microsoft提供了一个示例here。
答案 3 :(得分:4)
如果您想要登录文件并利用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:\用户\ yourUserName \应用程序数据\本地\软件包\ f15fdadf-FAAE-4f4a-8445-5feb195ff692_68newbw0j54vy \ LocalState \日志\的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)
答案 4 :(得分:0)
您可以在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();
}
```