Google.Cloud.Diagnostics.AspNetCore3 调试级别不工作

Google.Cloud.Diagnostics.AspNetCore3 debug level not working

考虑一个向导生成的 ASP.NET 核心项目 (NET 6)。添加 Google.Cloud.Diagnostics.AspNetCore3 NuGet 包和 services.AddGoogleDiagnosticsForAspNetCore()Startup.cs。让 GOOGLE_APPLICATION_CREDENTIALS 环境变量指向您的服务帐户的路径 JSON。

在应用程序的某处(例如控制器)添加以下内容:

_logger.LogDebug("Nope");
_logger.LogInformation("Yeah");

Google Cloud Logs Explorer 仅显示“是”(无特定过滤器)。我的 appsettings.json 看起来像:

"Logging": {
  "LogLevel": {
    "Default": "Debug",
    "System": "Information",
    "Microsoft": "Information"
  }
}

据我所知,"Default": "Debug" 应该可以在任何缺少更具体配置的地方使用。

为什么我没有看到“不”被记录?有什么明显的我想念的吗?值得一提的是,Visual Studio 调试输出和控制台输出均按预期显示 Nope/Yeah。

我已经下载了提到的包(它是 open-source)并检查了默认 logging-options 创建:

如您所见,默认的 logLevelInformation

并且当您完成实施时,没有从配置中读取 level 的迹象 - 它只是从您可能在代码中指定的选项传递过来的:

初始调用:

服务提供商注册:

创建日志提供程序和选项:

创建选项(第 1 张图片)

并创建记录器(可能由 ASP.NET 在内部某处调用)

简单的答案是 Google 默认情况下包不会从 appsettings.json 中读取任何内容。

您可以使用 LoggingOptions:
设置日志级别 (为简洁起见省略其他选项)

builder.Services.AddGoogleDiagnosticsForAspNetCore(loggingOptions: new Google.Cloud.Diagnostics.Common.LoggingServiceOptions
{
    // ... Other required options, e.g. projectId
    Options = Google.Cloud.Diagnostics.Common
        .LoggingOptions.Create(logLevel: LogLevel.Debug
        // ... Other necessary options 
        ),
});

简短回答:Google.Cloud.Diagnostics.AspNetCore3 不使用 appsettings.json(至少目前如此)并且必须明确设置日志级别。

现在是长答案和之后的工作代码。

为了向我们的项目添加 Google 诊断,我们有 3 个可用的 ...AddGoogleDiagnosticsForAspNetCore(...) 重载,并且 ...AddGoogle(...) 只是为了使用我们需要的服务,例如日志记录服务。 (开头的...根据dotnet版本不同,示例在结尾)。

1- 在 GCP 环境中,...AddGoogleDiagnosticsForAspNetCore() 签名用于设置诊断的默认值。服务详细信息是从 GCP 中获取的。

2-在GCP环境中,...AddGoogleDiagnosticsForAspNetCore( AspNetCoreTraceOptions, LoggingServiceOptions, ErrorReportingServiceOptions )签名我们可以设置3种类型的选项:AspNet Tracing、Logging Service和Error Reporting Service。

  • 对于这个用例,如果我们只需要日志记录服务,我们可以使用位置参数 (null,new LoggingServiceOptions{...},null)(不需要最后一个 null)或命名参数 (loggingOptions: new LoggingServiceOptions{...})
  • LoggingServicesOptions{...} 中有许多设置,但仅出于日志级别目的,以下内容就足够了:new LoggingServiceOptions{ Options = LoggingOptions.Create(logLevel: LogLevel.Debug) }.

现在我们来到了重要的部分。尽管文档隐含地涵盖了足够多的内容,但并未明确说明此用例将直接设置选项,而不是服务。

3- 虽然没有明确说明,但这种用法适用于 GCP 之外的情况或无法正确设置 GCP 的情况(不确定如何设置!?)AddGoogleDiagnosticsForAspNetCore( projectId, serviceName, serviceVersion, TraceOptions, LoggingOptions, ErrorReportingOptions )。这乍一看可能类似于第二个签名,但它没有为服务设置选项。

  • 当看到 Project ID was not provided and could not be autodetected 消息用于第一或第二签名时,他们必须将其作为参数提供,这会立即切换功能以使用此第三签名。
  • 在这种情况下,如果我们只需要日志记录服务,则必须以 (projectId,null,null,null,LoggingOptions...,null) 的形式用于位置参数(不需要最后一个 null)或 (projectId:"some ID",loggingOptions: LoggingOptions...) 用于命名参数
  • LoggingOptions... 只是 LoggingOptions.Create(logLevel: LogLevel.Debug) 设置日志级别。

4- 除了在向服务添加 Google 诊断时添加这些详细信息外,我们还可以在设置配置时添加日志记录选项:...AddGoogle( LoggingServiceOptions{...} )。但是在这个使用中,我们需要在里面提供一个projectId; new LoggingServiceOptions{ ProjectId = "some ID", Options = LoggingOptions.Create(logLevel: LogLevel.Debug) }


填写...

dotnet 6 开始使用新的顶级语句。所以我们要遵循以下步骤。

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddGoogleDiagnosticsForAspNetCore(
 projectId: "some ID",
 loggingOptions:  LoggingOptions.Create(logLevel: LogLevel.Debug)
);

// or
var builder = WebApplication.CreateBuilder(args);
builder.Logging.AddGoogle(
  new LoggingServiceOptions { 
    ProjectId = "some ID",
    Options=LoggingOptions.Create(logLevel:LogLevel.Debug)
  }
);

由于 OP 提到了 Startup.cs 的使用,该项目使用旧样式,因此这些是所需的部分。

// inside ConfigureServices
services.AddGoogleDiagnosticsForAspNetCore(
 projectId: "some ID",
 loggingOptions:  LoggingOptions.Create(logLevel: LogLevel.Debug)
);

// or
// before using "UseStartup"
.ConfigureLogging(
  builder => builder.AddGoogle(
    new LoggingServiceOptions { 
      ProjectId = "some ID",
      Options=LoggingOptions.Create(logLevel:LogLevel.Debug)
    }
  )
)

额外

我们可以从配置文件中读取(top-level格式)

var builder = WebApplication.CreateBuilder(args);
var config = builder.Configuration;
builder.Services.AddGoogleDiagnosticsForAspNetCore(
  projectId:config["GCP:ID"],
  loggingOptions:  LoggingOptions.Create(
     logLevel: Enum.Parse<LogLevel>(config["GCP:Logging:LogLevel:Default"]
)));

并在 appsettings.json

中添加 GCP 部分
  "GCP":{
    "ID":"some ID",
    "Logging":{
      "LogLevel":{
        "Default":"Debug"
      }
    }
  }