web-dev-qa-db-fra.com

Logger pour l'application Windows 10 UWP

Je n'ai trouvé aucun enregistreur pour l'application universelle Windows 10, j'ai essayé log4net, la bibliothèque d'entreprise Microsoft, Nlog, mais aucun d'entre eux n'est pris en charge dans la plate-forme universelle Windows 10.

Quelqu'un peut-il me suggérer un bon enregistreur pour Windows 10 UWP?

21
Rashmin Javiya

Avez-vous essayé MetroLog? Vous pouvez l'installer à l'aide de NuGet:

Install-Package MetroLog

Voici un exemple rapide:

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.");

Vous pouvez trouver un tutoriel expliquant comment l'ajouter à votre projet sur http://talkitbr.com/2015/06/11/adicionando-logs-em-universal-apps . Il existe également une explication concernant la récupération de ces journaux.

21
talkitbr

Serilog

Une possibilité est d'utiliser Serilog comme interface de journalisation centrale et de le configurer pour avoir un récepteur qui fonctionne avec UWP.

Vous pouvez utiliser l'un des nombreux récepteurs que vous pouvez choisir , mais vous pouvez également choisir d'utiliser votre propre infrastructure de journalisation en implémentant un récepteur personnalisé.

Pour le rendre encore plus utile, vous pouvez utiliser Anotar.Serilog.Fody pour utiliser Fody Code Weaver et utiliser Aspects pour rendre votre journalisation triviale.

En règle générale, vous souhaitez utiliser un fournisseur de journalisation central pour Application Lifecycle Management (ALM), ainsi qu'un récepteur local (fichier) comme solution de rechange pour les erreurs fatales.

MetroLog

MetroLog est une infrastructure de journalisation simple au-dessus de ETW et LocalState. C'est rapide et facile à implémenter, mais cela ne vous aide pas avec ALM, car la journalisation centralisée n'est pas prise en charge.

Journalisation UWP

niversal Windows Plattform Logging est relativement nouveau et n'est possible qu'avec Windows 10 et Windows Server 2016. Vous pouvez choisir entre ETW et LocalStorage. Il vous donne un contrôle de bas niveau sur l'apparence de votre journal, mais entraîne également le plus de travail à implémenter et manque également de capacités ALM.

Liens utiles

13
MovGP0

La seule solution que je connaisse est d'utiliser les API dans l'espace de noms windows.foundation.diagnostics pour effectuer le traçage ETW.

Et Microsoft a fourni un exemple ici .

4
Alan Yao - MSFT

Si vous souhaitez vous connecter à un fichier et profiter du cadre DI léger de Microsoft, vous pouvez utiliser Serilog.

Dans la console Nuget Package Manager, entrez les informations suivantes:

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

Configurez le conteneur d'injection de dépendance à la racine de la composition. Dans notre cas, il s'agit de la méthode OnLaunched dans le fichier 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'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);
    ...
}

Une fois configuré, l'enregistrement est très simple. Injectez simplement l'enregistreur dans votre classe.

using Microsoft.Extensions.Logging;

class MyClass
{
    readonly ILogger<MyClass> logger;

    public MyClass(ILogger<MyClass> logger)
    {
        this.logger = logger;
        logger.LogInformation("Hello from MyClass.");
    }
}

Votre fichier journal doit être créé dans:

C:\Users\yourUserName\AppData\Local\Packages\f15fdadf-faae-4f4a-8445-5feb195ff692_68newbw0j54vy\LocalState\Logs\App-20171206.log,

où f15fdadf-faae-4f4a-8445-5feb195ff692_68newbw0j54vy est le nom du package du fichier Package.appxmanifest dans ma solution.

Veuillez noter que le dossier AppData est masqué dans l'Explorateur de fichiers par défaut.

Et voici son contenu:

2017-12-06T17:06:33.1358005-06:00  [INF] Hello from MyClass. (25278b08)
4

Vous pouvez utiliser le récepteur standard de fichiers déroulants Serilog dans UWP, il vous suffit de dire à l'enregistreur où se connecter. Voici un code pour configurer cela (j'utilise 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();
}

`` ''

0
Stuart Hallows