NubieJ
NubieJ

Reputation: 585

FluentValidation errors to Logger

I'm registering my FluentValidation validators as follows:

services.AddFluentValidation(fv => fv.RegisterValidatorsFromAssemblyContaining<CustomRequestValidator>());

How can I get a handle of any validation errors to log them via my logging implementation, e.g. Serilog?

Upvotes: 4

Views: 7244

Answers (2)

JP Roussel
JP Roussel

Reputation: 155

To jump onto what @mdarefull said, I did the following:

public void ConfigureServices(IServiceCollection services)
{
    // Possible other service configurations

    services.AddMvc()
        .ConfigureApiBehaviorOptions(options =>
        {
            options.InvalidModelStateResponseFactory = context =>
            {
                if (!context.ModelState.IsValid)
                {
                    LogAutomaticBadRequest(context);
                }

                return new BadRequestObjectResult(context.ModelState);
            };
        });

    // Possible other service configurations
}

The LogAutomaticBadRequest method is as follows:

private static void LogAutomaticBadRequest(ActionContext context)
{
    // Setup logger from DI - as explained in https://github.com/dotnet/AspNetCore.Docs/issues/12157
    var loggerFactory = context.HttpContext.RequestServices.GetRequiredService<ILoggerFactory>();
    var logger = loggerFactory.CreateLogger(context.ActionDescriptor.DisplayName);

    // Get error messages
    var errorMessages = string.Join(" | ", context.ModelState.Values
        .SelectMany(x => x.Errors)
        .Select(x => x.ErrorMessage));

    var request = context.HttpContext.Request;

    // Use whatever logging information you want
    logger.LogError("Automatic Bad Request occurred." +
                    $"{System.Environment.NewLine}Error(s): {errorMessages}" +
                    $"{System.Environment.NewLine}|{request.Method}| Full URL: {request.Path}{request.QueryString}");
}

Upvotes: 2

mdarefull
mdarefull

Reputation: 1039

For users stumbling into this problem (like me) I'd like to provide the solution I found.

The actual problem is that ASP.NET Core, and APIs in particular, make Model State errors automatically trigger a 400 error response, which doesn't log the validation errors.

Below that same documentation they include instructions on how to enable automatic logging for that feature which I believe should be the correct solution to this problem.

Upvotes: 4

Related Questions