Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何配置多个接收器,使每个接收器都有自己的最低日志级别(基于命名空间)_C#_.net_Asp.net Core_Azure Application Insights_Serilog - Fatal编程技术网

C# 如何配置多个接收器,使每个接收器都有自己的最低日志级别(基于命名空间)

C# 如何配置多个接收器,使每个接收器都有自己的最低日志级别(基于命名空间),c#,.net,asp.net-core,azure-application-insights,serilog,C#,.net,Asp.net Core,Azure Application Insights,Serilog,请参见下面的示例,默认的ASP.NET核心日志记录设置,其中默认的loglevel为“信息”,但对于ApplicationInsights而言,Microsoft命名空间的loglevel为警告: "Logging": { "LogLevel": { "Default": "Information" }, "ApplicationInsights": {

请参见下面的示例,默认的ASP.NET核心日志记录设置,其中默认的
loglevel
为“信息”,但对于
ApplicationInsights
而言,Microsoft命名空间的
loglevel
为警告:

"Logging": {
    "LogLevel": {
      "Default": "Information"
    },
    "ApplicationInsights": {
      "LogLevel": {
        "Default": "Information",
        "Microsoft": "Warning"
      }
    }
  }
这很有用,因为我不想将健康请求记录到App Insights,例如。不将其发送到App Insights将导致更少的账单

现在,我真的不知道如何使用
Serilog
实现这一点。我使用控制台和应用程序。似乎
minimumLevel
是为整个serilog记录器配置的,而不是基于接收器


编辑:我已经放弃了这个问题,因为它对于我的用例来说太复杂了

我已经放弃了用Serilog来实现这一点,因为.NET5.0日志记录有了很大的改进;我不再需要Serilog了

我已通过以下代码实现了不将健康请求记录到App Insights的愿望:

"Logging": {
  "LogLevel": {
    "Default": "Information"
  },
  "ApplicationInsights": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information",
      "IdentityServer4.AccessTokenValidation": "Warning",
      "System.Net.Http.HttpClient": "Warning"
    }
  },
  "Console": {
    "FormatterName": "Simple",
    "LogLevel": {
      "Default": "Information"
    },
    "FormatterOptions": {
      "SingleLine": false,
      "TimestampFormat": "[yyyy-MM-ddThh:mm:ss] "
    }
  }
},
添加了
IdentityServer4.AccessTokenValidation
System.Net.Http.HttpClient
,因为它们会记录一些我不需要在应用程序中查看的信息,因为它们已经作为
请求
记录

控制台将记录所有内容,以便在必要时进行更深入的调试

此外,为了防止App Insights每隔几秒钟保存一次“健康”请求,我已经使用了阻止App Insights保存某些请求。请注意,我确实使用了一些空检查,因为有时URL可能是空的,这取决于遥测

/// <summary>
/// Stops certain requests from being logged to App Insights to prevent noise and save money.
/// </summary>
/// <remarks>
/// Based on https://blog.steadycoding.com/azure-application-insights-without-noise-from-health-checks-and-swagger/
/// </remarks>
public class IgnoreRequestPathsTelemetryProcessor : ITelemetryProcessor
{
    private readonly ITelemetryProcessor _next;

    private readonly IEnumerable<string> _pathsToIgnore = new[]
    {
        "/health",
        "/swagger"
    };

    private static readonly StringComparison _stringComparison = StringComparison.InvariantCultureIgnoreCase;

    public IgnoreRequestPathsTelemetryProcessor(ITelemetryProcessor next)
    {
        _next = next;
    }

    public void Process(ITelemetry item)
    {
        if (ShouldFilterOutTelemetry(item))
        {
            return;
        }

        _next.Process(item);
    }

    private bool ShouldFilterOutTelemetry(ITelemetry item)
    {
        return item is RequestTelemetry request && _pathsToIgnore.Any(x => request.Url?.AbsolutePath?.StartsWith(x, _stringComparison) == true);
    }
}

//
///阻止某些请求被记录到App Insights,以防止噪音并节省资金。
/// 
/// 
///基于https://blog.steadycoding.com/azure-application-insights-without-noise-from-health-checks-and-swagger/
/// 
公共类IgnoreRequestPathsTelemetryProcessor:ITelemetryProcessor
{
私有只读ITelemetryProcessor\u next;
私有只读IEnumerable\u pathsToIgnore=new[]
{
“/健康”,
“/大摇大摆”
};
私有静态只读StringComparison\u StringComparison=StringComparison.InvariantCultureInogoreCase;
公共IgnoreRequestPathsTelemetryProcessor(ITelemetryProcessor next)
{
_下一个=下一个;
}
公共作废流程(ITelemetry项)
{
if(应过滤器输出电量(项目))
{
返回;
}
_下一步:过程(项目);
}
私人布尔滤波器输出电压测量(ITelemetry项目)
{
返回项为RequestTelemetry请求&&&u pathsToIgnore.Any(x=>request.Url?.AbsolutePath?.StartsWith(x,_stringComparison)==true);
}
}

接收器配置方法通常提供一个可传递的
restrictedToMinimumLevel
参数。(但它无法启用在全局Serilog管道级别禁用的级别)

此参数也可通过JSON配置获得

维基中的更多信息:

您可以在这里找到一个示例:


GH问题:

我想您需要Serilog的子记录器功能。但是由于没有使用它,我不能肯定地说这是否回答了你的问题@pinkfloydx33嗯,这是我可以尝试的,尽管它看起来相当麻烦。我要试试这个!如果其他人遇到此问题,而我没有回应该解决方案是否有效,请提醒我回应:)。下面的答案有用吗?您好。谢谢你的帮助。我已决定不再继续使用Serilog;自从改进了登录.NET5.0以来,它的收益微乎其微,所以我改用了这个。与基本的.net 5.0日志记录相比,为不同的接收器的名称空间设置不同的日志记录级别似乎要复杂得多。此外,我曾经阻止App Insights记录我不需要的请求。谢谢你的帮助。我已决定不再继续使用Serilog;自从改进了登录.NET5.0以来,它的收益微乎其微,所以我改用了这个。与基本的.net 5.0日志记录相比,为不同的接收器的名称空间设置不同的日志记录级别似乎要复杂得多。此外,我还曾经阻止App Insights记录我不需要的请求。