仅写日志进行自定义日志记录

时间:2020-05-18 10:33:45

标签: asp.net-core asp.net-core-webapi microsoft-extensions-logging

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

我试图仅将自己的自定义日志记录在asp.net core 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": "*"
}

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

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

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

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

没有日志。

2 个答案:

答案 0 :(得分:1)

首先,请注意,ApplicationInsights键的含义取决于JSON文件中的位置,有两种截然不同的含义。

如果密钥位于JSON根级别(即您所谓的“外部”),则用于配置Application Insights,并在其中指定检测密钥。看起来像这样:

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

第二,如果它位于Logging部分中,则用于配置ApplicationInsightsLoggerProvider,它确定将哪个日志级别发送到Application Insights。这就是ILogger log filtering机制。

默认情况下,仅日志级别warning或更高级别的日志被发送到应用数据分析。如果只想将所有日志发送给应用程序见解,则可以为您的命名空间配置它,或者忽略来自SystemMicrosoft命名空间的消息:

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

答案 1 :(得分:0)

首先,无需将这些提供程序设置放在“日志记录”之外(您不应该)。
您想要的每个日志记录设置都只能放在内部(除非配置了提供程序来专门读取该设置)

现在要回答您的问题,假设您的应用程序的根名称空间是MyNetCore。 (与项目名称相似)。

如果使用的是Visual Studio,则可以从“项目属性”->“应用程序”->“默认命名空间”中查看项目的根名称空间

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

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

此处设置的日志记录级别为minimum级别。
如果将其设置为跟踪(0),将显示所有日志级别(大于0)。即从InformationCritical
如果将其设置为“无”(6),则不会显示任何日志
参考不同的日志级别: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软件包。否则,配置将被完全忽略。