仅为自定义日志记录写入日志

Only write logs for custom logging

我正在关注这篇文章: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/logging/?view=aspnetcore-3.1

我试图只在 asp.net 核心 3.1 API 中记录我自己的自定义日志记录。并非所有日志都是从 asp.net 核心生成的。我创建了一个空白的天气预报服务:

[HttpGet]
public IEnumerable<WeatherForecast> Get()
{
    _logger.LogTrace("LogTrace");
    _logger.LogDebug("LogDebug");
    _logger.LogInformation("LogInformation");
    _logger.LogError("LogError");

    var rng = new Random();
    return Enumerable.Range(1, 5).Select(index => new WeatherForecast
    {
        Date = DateTime.Now.AddDays(index),
        TemperatureC = rng.Next(-20, 55),
        Summary = Summaries[rng.Next(Summaries.Length)]
    })
    .ToArray();
}

appsettings.json:

{
  "Logging": {
    "LogLevel": {
      "Default": "Trace",
      "Microsoft": "Trace",
      "TestAPI": "Trace"
    },
    "ApplicationInsights": {
      "InstrumentationKey": "xx-xx-x-x-xx",
      "LogLevel": {
        "Default": "Trace",
        "Microsoft": "Trace",
        "TestAPI": "Trace"
      }
    }
  },
  "AllowedHosts": "*"
}

我安装了以下 nuget 版本 2.14.0: Microsoft.Extensions.Logging.ApplicationInsights Microsoft.ApplicationInsights.AspNetCore

现在我尝试 运行 应用程序,但没有任何日志。

我尝试添加 services.AddApplicationInsightsTelemetry();启动:

public void ConfigureServices(IServiceCollection services)
{
    services.AddApplicationInsightsTelemetry();
    services.AddControllers();
}

同样没有日志。

首先,没有必要将那些提供商设置放在"Logging"之外(你不应该)。
您想要的每个日志记录设置都应该只放在里面(除非有一个配置为专门读取它的提供程序)

现在回答您的问题,假设您的应用程序的根命名空间是 MyNetCore。 (这将类似于项目的名称)。

If you are using Visual Studio, You can view your Project's root namespace from Project Properties -> Application -> Default Namespace

要仅从您的应用程序查看日志,您必须将默认日志记录级别设置为 None,并将项目的日志记录级别 MyNetCore 设置为 Trace
[编辑: 您已分别为 ApplicationInsights(或任何其他提供程序)设置日志记录级别。默认为 kestrel.]

"Logging": {
    "LogLevel": {
        "Default": "None",
        "MyNetCore": "Trace"
    },
    "ApplicationInsights": {
        "InstrumentationKey": "xxx-36a5-4687-b1fc-xxxxxx",
        "LogLevel": {
            "Default": "None",
            "MyNetCore": "Trace"
        }
    }
}

The Logging level set here is the minimum level.
If you set it to Trace (0), all the log levels (greater than 0) will be shown. i.e. From Information to Critical
If you set it to None (6), no logs will be shown
Reference to different Log Levels : https://docs.microsoft.com/en-us/dotnet/api/microsoft.extensions.logging.loglevel

如果您只想查看来自 asp.net 核心的错误,以及您应用程序的每个日志级别,那么您可以这样做。

"Logging": {
    "LogLevel": {
        "Default": "None",
        "Microsoft": "Error",
        "MyNetCore": "Trace"
    },
    "ApplicationInsights": {
        "InstrumentationKey": "xxx-36a5-4687-b1fc-xxxxxx",
        "LogLevel": {
            "Default": "None",
            "Microsoft": "Error",
            "MyNetCore": "Trace"
        }
    }
}

编辑: 要阅读上面的 ApplicationInsights 配置,您需要安装 Microsoft.Extensions.Logging.ApplicationInsights nuget 包。否则配置将被完全忽略。

首先,请注意 ApplicationInsights 键根据它在 JSON 文件中的位置不同,有两种截然不同的含义。

如果密钥位于 JSON 根级别(即您所说的 "outside"),它用于配置 Application Insights,并且您可以在其中指定检测密钥。看起来像这样:

{
  "ApplicationInsights": {
    "Instrumentationkey":"xxx-36a5-4687-b1fc-xxxxxx"
  }
}

其次,如果它位于 Logging 部分内,则用于配置 ApplicationInsightsLoggerProvider, which determines which log level is sent to Application Insights. That's the ILogger log filtering 机制。

默认情况下,只有 warning 或更高级别的日志会发送到应用洞察。如果您只想将所有日志发送到 Application Insights,您可以为您的命名空间配置它,或者忽略来自 SystemMicrosoft 命名空间的消息:

{
  "Logging": {
    "ApplicationInsights": {
      "LogLevel": {
        "Default": "Trace"
        "System": "None",
        "Microsoft": "None"
      }
    }
}