Logger для Windows 10 UWP-приложения

Я не смог найти никаких журналов для универсального приложения Windows 10, я опробовал log4net, корпоративную библиотеку Microsoft, Nlog, но ни один из них не поддерживается в Windows 10 Universal.

Может ли кто-нибудь предложить мне хороший регистратор для Windows 10 UWP?

Ответы

Ответ 1

Вы пробовали 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. Также есть объяснение относительно извлечения этих журналов.

Ответ 2

Serilog

Одна из возможностей состоит в том, чтобы использовать Serilog в качестве центрального интерфейса ведения журнала и настроить его на использование Sink, который работает с UWP.

Вы можете использовать один из многих Sinks, которые вы можете выбрать из, но вы также можете использовать свою собственную инфраструктуру регистрации, внедряя пользовательскую раковину.

Чтобы сделать его еще более полезным, вы можете использовать Anotar.Serilog.Fody для использования Fody Code Weaver и используйте Аспекты, чтобы сделать ваш журнал тривиальным.

Обычно вы хотите использовать центральный поставщик протоколирования для управления жизненным циклом приложений (ALM), а также локальный приемник (файл) в качестве резервного для фатальных ошибок.

MetroLog

MetroLog - это простая инфраструктура ведения журналов поверх ETW и LocalState. Это быстро и легко реализовать, но это не поможет вам с ALM, поскольку централизованное ведение журнала не поддерживается.

Запись в UWP

Универсальное ведение журнала Windows Plattform является относительно новым и возможно только с Windows 10 и Windows Server 2016. Вы можете выбирать между ETW и LocalStorage. Это дает вам самый низкий уровень контроля над тем, как должен выглядеть ваш журнал, но, естественно, также вызывает большую работу по реализации, а также отсутствие возможностей ALM.

Полезные ссылки

Ответ 3

Единственное, что я знаю, это использовать API в пространстве имен windows.foundation.diagnostics, чтобы трассировать ETW.

И Microsoft предоставила образец здесь.

Ответ 4

Если вы хотите подключиться к файлу и воспользоваться преимуществами облегченной рамки DI Microsoft, вы можете использовать Serilog.

В Nuget Package Manager Console введите следующее:

Install-Package Microsoft.Extensions.DependencyInjection
Install-Package Microsoft.Extensions.Logging
Install-Package Serilog.Extensions.Logging.File

Настройте контейнер инъекции зависимостей в корне композиции. В нашем случае это метод OnLaunched в файле App.xaml.cs.

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 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-ФААЭ-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)

Ответ 5

Вы можете использовать стандартный потоковый файл Serilog в UWP, вам просто нужно сообщить регистратору, к которому нужно войти. Вот некоторый код, чтобы установить это (я использую 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();
}

`` `