ASP.NET Core Web App日志404请求为警告 [英] ASP.NET Core Web App log 404 requests as warning

查看:57
本文介绍了ASP.NET Core Web App日志404请求为警告的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如果我使用 dotnet new mvc 创建一个新的 ASP.NET Core Web App(模型-视图-控制器),它已经开箱即用地进行了配置./p>

但是,http请求错误代码会记录为信息事件.

 信息:Microsoft.AspNetCore.Hosting.Internal.WebHost [1]请求启动HTTP/1.1 GET https://localhost:5001/doesnotexists信息:Microsoft.AspNetCore.Hosting.Internal.WebHost [2]请求已在4.4052ms内完成404 

是否可以通过调查和重写日志事件将此行为更改为(4xx->警告,5xx->错误).

我已经阅读了 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)=>{//调查并重写日志事件}).UseStartup< Startup>().建造() 

解决方案

您需要实现自己的 ILogger ILoggerProvider .

一个简单的演示,例如:

  1. CustomLogger

     公共类CustomLogger:ILogger{公共CustomLogger(){}公用IDisposable BeginScope< TState>(TState状态)=>NullScope.Instance;公共布尔IsEnabled(LogLevel logLevel)=>真的;公共无效Log< TState>(LogLevel logLevel,EventId eventId,TState状态,异常异常Func< TState,异常,字符串>格式化程序){var msg = formatter(state,exception);如果(msg.Contains("404")){logLevel = LogLevel.Warning;}Console.WriteLine($"{GetLogLevelString(logLevel)}:{eventId} {msg} {exception}");}私有静态字符串GetLogLevelString(LogLevel logLevel){开关(logLevel){案例LogLevel.Trace:返回"trce";案例LogLevel.Debug:返回"dbug";案例LogLevel.Information:返回信息";案例LogLevel.Warning:返回警告";案例LogLevel.Error:返回失败";案例LogLevel.Critical:返回暴击";默认:抛出新的ArgumentOutOfRangeException(nameof(logLevel));}}} 

  2. CustomLoggerProvider

     公共类CustomLoggerProvider:ILoggerProvider{公共ILogger CreateLogger(字符串categoryName){返回新的CustomLogger();}公共无效Dispose(){}} 

  3. 注册以上代码

     公共静态IWebHostBuilder CreateWebHostBuilder(string [] args)=>WebHost.CreateDefaultBuilder(args).UseStartup< Startup>().ConfigureLogging(config => {config.ClearProviders();config.AddProvider(new CustomLoggerProvider());}); 

    您可以检查记录并实现自己的日志提供者.

If I create a new ASP.NET Core Web App (Model-View-Controller) with dotnet new mvc it has already logging configured out of the box.

However, http request error codes are logged as info event.

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

Is it possible to changed this behaviour to (4xx -> warning, 5xx -> error) .i.e by investigating and rewriting log events.

I already read https://docs.microsoft.com/en-us/aspnet/core/fundamentals/logging/?view=aspnetcore-2.2

this looked promissing but I didn't find a hook for this purpose

    var webHost = new WebHostBuilder()
        .UseKestrel()
        .UseContentRoot(Directory.GetCurrentDirectory())
        .ConfigureLogging((hostingContext, logging) =>
        {
            // investigate and rewrite log event
        })
        .UseStartup<Startup>()
        .Build()

解决方案

You need to implement your own ILogger and ILoggerProvider.

A simple demo like:

  1. 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));
                }
            }
    
        }
    

  2. CustomLoggerProvider

    public class CustomLoggerProvider : ILoggerProvider
    {
        public ILogger CreateLogger(string categoryName)
        {
            return new CustomLogger();
        }
    
        public void Dispose()
        {
    
        }
    }
    

  3. Register above code

            public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
                WebHost.CreateDefaultBuilder(args)
                    .UseStartup<Startup>()
                    .ConfigureLogging(config => {
                        config.ClearProviders();
                        config.AddProvider(new CustomLoggerProvider());
                    });
    

    You could check Logging and implement your own log provider.

这篇关于ASP.NET Core Web App日志404请求为警告的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆