web-dev-qa-db-fra.com

Comment forcer Serilog à enregistrer uniquement mes messages de journal personnalisés

J'ai configuré Serilog dans appsettings.json pour enregistrer les entrées dans Logstash via tcp dans mon asp net core web api app de la manière suivante:

{
  "Serilog": {
    "Using": [ "Serilog.Sinks.Network" ],
    "MinimumLevel": {
      "Default": "Information"
    },
    "WriteTo:0": {
      "Name": "TCPSink",
      "Args": {
        "uri": "tcp://172.26.48.39:5066"
      }
    },
    "Properties": {
      "app_id": "my-service-api",
      "index": "my-app-"
    }
  },
  ...
}

Mais il enregistre trop de messages. Par exemple, j'ai une méthode d'action CreateToken dans le contrôleur de jeton:

[HttpPost]
public ActionResult<string> CreateToken([FromBody] CredentialsModel credentials)
{
    var user = _authentication.Authenticate(credentials);

    if (user == null)
    {
        Log.Warning("Unable to authenticate an user: {Login}, {Password}",
        credentials.Username, credentials.Password);

        return Unauthorized();
    }

    return BuildToken();
}

Je dois enregistrer un seul message:

Impossible d'authentifier le mot de passe de connexion d'un utilisateur

Mais Serilog enregistre les éléments suivants:

Demande de démarrage HTTP/1.1 POST http: // localhost: 5000/api/token application/json 57

Route correspondant à "{action = \" CreateToken\", controller = \" Token\"}". Exécution de l'action "Deal.WebApi.Controllers.TokenController.CreateToken (Deal.WebApi)"

Exécution de la méthode d'action "Deal.WebApi.Controllers.TokenController.CreateToken (Deal.WebApi)" avec des arguments (["Deal.BL.Models.Auth.CredentialsModel"]) - État de validation: valide

Impossible d'authentifier un utilisateur: mot de passe de connexion

La méthode d'action exécutée "Deal.WebApi.Controllers.TokenController.CreateToken (Deal.WebApi)", a renvoyé le résultat "Microsoft.AspNetCore.Mvc.UnauthorizedResult" dans 11.0935ms.

Exécution de HttpStatusCodeResult, définition du code d'état HTTP 401

Action exécutée "Deal.WebApi.Controllers.TokenController.CreateToken (Deal.WebApi)" en 95,272 ms

Demande terminée en 123.9485ms 401

Comment puis-je me débarrasser des messages indésirables?

C'est mon Program.cs fichier:

public class Program
{
    public static void Main(string[] args)
    {
        var currentEnv = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");

        var config = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json")
            .AddJsonFile($"appsettings.{currentEnv}.json", true)
            .AddEnvironmentVariables()
            .Build();

        Log.Logger = new LoggerConfiguration()
            .ReadFrom.Configuration(config)
            .CreateLogger();

        try
        {
            Log.Information("Start web Host");

            CreateWebHostBuilder(args).Build().Run();                
        }
        catch (Exception ex)
        {
            Log.Fatal(ex, "Host terminated unexpectedly");
        }
        finally
        {
            Log.CloseAndFlush();
        }
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseSerilog()
            .UseStartup<Startup>();
}
8
Dmitry Stepanov

Vous pouvez remplacer les messages de journal de catégorie dans votre appsettings.json. Par exemple, le appsettings.json Suivant définit les messages de journal Microsoft pour qu'ils se déconnectent uniquement pour ceux considérés Error:

"Serilog": {
    "MinimumLevel": {
        "Default": "Information",
        "Override": {
            "Microsoft": "Error"
        }
    },
    ...
}

La propriété qui nous intéresse ici est Override, qui représente un objet dont les propriétés sont des préfixes de catégorie et les valeurs sont les Niveau de journal Serilog à utiliser.

Étant donné que votre propre message de journal personnalisé ne sera pas enregistré dans une catégorie Microsoft, vous verrez toujours ce dans la sortie.

6
Kirk Larkin