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 创建:
如您所见,默认的 logLevel
是 Information
。
并且当您完成实施时,没有从配置中读取 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"
}
}
}
考虑一个向导生成的 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 创建:
如您所见,默认的 logLevel
是 Information
。
并且当您完成实施时,没有从配置中读取 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":{
"ID":"some ID",
"Logging":{
"LogLevel":{
"Default":"Debug"
}
}
}