[英]ASP.NET Core Web App log 404 requests as warning
如果我使用dotnet new mvc
創建一個新的ASP.NET Core Web App (Model-View-Controller)
,它已經配置了開箱即用的日志記錄。
但是,http 請求錯誤代碼記錄為信息事件。
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
Request starting HTTP/1.1 GET https://localhost:5001/doesnotexists
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[2]
Request finished in 4.4052ms 404
是否可以通過調查和重寫日志事件將此行為更改為 (4xx -> warning, 5xx -> error) .ie。
我已經閱讀了https://docs.microsoft.com/en-us/aspnet/core/fundamentals/logging/?view=aspnetcore-2.2
這看起來很有希望,但我沒有找到用於此目的的鈎子
var webHost = new WebHostBuilder()
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.ConfigureLogging((hostingContext, logging) =>
{
// investigate and rewrite log event
})
.UseStartup<Startup>()
.Build()
單線解決方案
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
namespace temp
{
public class Startup
{
public void Configure(IApplicationBuilder app, IHostEnvironment env, ILogger<Startup> logger)
{
...
app.UseStatusCodePages(async context =>
{
var code = context.HttpContext.Response.StatusCode;
if (code == 404) {
logger.Log(LogLevel.Error, null, "log message");
}
});
...
}
}
}
您需要實現自己的ILogger
和ILoggerProvider
。
一個簡單的演示,如:
CustomLogger
public class CustomLogger : ILogger { public CustomLogger() { } public IDisposable BeginScope<TState>(TState state)=> NullScope.Instance; public bool IsEnabled(LogLevel logLevel) => true; public void Log<TState>( LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter ) { var msg = formatter(state, exception); if (msg.Contains("404")) { logLevel = LogLevel.Warning; } Console.WriteLine($"{ GetLogLevelString(logLevel) } : { eventId } { msg } { exception }"); } private static string GetLogLevelString(LogLevel logLevel) { switch (logLevel) { case LogLevel.Trace: return "trce"; case LogLevel.Debug: return "dbug"; case LogLevel.Information: return "info"; case LogLevel.Warning: return "warn"; case LogLevel.Error: return "fail"; case LogLevel.Critical: return "crit"; default: throw new ArgumentOutOfRangeException(nameof(logLevel)); } } }
CustomLoggerProvider
public class CustomLoggerProvider : ILoggerProvider { public ILogger CreateLogger(string categoryName) { return new CustomLogger(); } public void Dispose() { } }
注冊上面的代碼
public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args) .UseStartup<Startup>() .ConfigureLogging(config => { config.ClearProviders(); config.AddProvider(new CustomLoggerProvider()); });
您可以檢查Logging並實現您自己的日志提供程序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.