在特定环境(本地主机)中禁用 HangFire 服务器
Disable HangFire server in specific environment (localhost)
我们有一个计划的 HangFire 作业,每 4
小时 运行 秒。但是 hangfire 会在每个预定的时间间隔内用心跳充斥控制台。当我们 运行 在本地开发新功能(或)调试现有代码的应用程序时,这会很烦人。
我可以通过增加 HearbeatInterval
配置来减少心跳日志。
本地应用程序和托管开发环境应用程序具有相同的数据库。托管开发 API 已经 运行 成为经常性工作。因此,除非有必要(除非我想 debug/test 计划的作业),否则我不想 运行 在我们的本地机器上(使用 API 开发)。
由于这对开发人员来说是很常见的场景,我想了解 HangFire 是否提供了实现此目的的标准方法?
注意:我已经通过 hangfire
标签和 HangFire 文档查看了所有 Whosebug 问题,以查看这是否适用于没有自定义代码的 OOB 解决方案。
docs 说您可以直接在 appsettings.json
文件中配置日志级别。
您可以像这样减少所有 Hangfire 日志的消息数量:
{
"Logging": {
"LogLevel": {
...
"Hangfire": "Warning" //Only log warnings from Hangfire
}
}
}
但您可能只想排除特定的邮件子集。我不确定心跳消息到底是什么命名空间,但你可以这样做:
{
"Logging": {
"LogLevel": {
...
"Hangfire": "Information", //Output information and above for all Hangfire logs
"Hangfire.Server.ServerWatchdog": "Warning" // but only warnings for the
// Hangfire.Server.ServerWatchdog namespace
}
}
}
HangFire 库中没有任何 OOB 选项。
正如 Camilo Terevinto
提到的,我能够实现以下解决方法。
public void ConfigureServices(IServiceCollection services)
{
// other service configuration goes here
if (IsHangfireJobsAllowed())
{
// HangFire configuration
var storage = HangFireJobs.GetHangFireStorageConnection(
config["CosmosDBEndpoint"],
config["CosmosDBAuthKey"],
config["CosmosDBDatabaseName"]);
// Add HangFire services.
services.AddHangfire(configuration => configuration
.SetDataCompatibilityLevel(CompatibilityLevel.Version_170)
.UseSimpleAssemblyNameTypeSerializer()
//.UseRecommendedSerializerSettings()
.UseSerializerSettings(new JsonSerializerSettings() { ReferenceLoopHandling = ReferenceLoopHandling.Ignore })
.UseStorage(storage));
// Add the processing server as IHostedService
services.AddHangfireServer();
GlobalJobFilters.Filters.Add(new AutomaticRetryAttribute { Attempts = 0 });
}
// other service configuration goes here
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IConfiguration config)
{
// Other code goes here
if (IsHangfireJobsAllowed())
{
app.UseHangfireDashboard("/hangfire");
// Custom code to schedule the recurring jobs
HangFireJobScheduler.ScheduleRecurringJobs();
}
// Other code follows here
}
private bool IsHangfireJobsAllowed()
{
// For QA and Prod env's add HangFire with out config dependency
if (!Environment.IsDevelopment())
return true;
// For Dev environment adding HangFire conditionally
// Ignoring return value since, the result will have 'true'
// only if the parsing is success and config has 'true'
bool.TryParse(Configuration["HangFire:RunJobsOnDev"], out bool result);
return result;
}
Camilo Terevinto
和DavidG
,谢谢你们。
我们有一个计划的 HangFire 作业,每 4
小时 运行 秒。但是 hangfire 会在每个预定的时间间隔内用心跳充斥控制台。当我们 运行 在本地开发新功能(或)调试现有代码的应用程序时,这会很烦人。
我可以通过增加 HearbeatInterval
配置来减少心跳日志。
本地应用程序和托管开发环境应用程序具有相同的数据库。托管开发 API 已经 运行 成为经常性工作。因此,除非有必要(除非我想 debug/test 计划的作业),否则我不想 运行 在我们的本地机器上(使用 API 开发)。
由于这对开发人员来说是很常见的场景,我想了解 HangFire 是否提供了实现此目的的标准方法?
注意:我已经通过 hangfire
标签和 HangFire 文档查看了所有 Whosebug 问题,以查看这是否适用于没有自定义代码的 OOB 解决方案。
docs 说您可以直接在 appsettings.json
文件中配置日志级别。
您可以像这样减少所有 Hangfire 日志的消息数量:
{
"Logging": {
"LogLevel": {
...
"Hangfire": "Warning" //Only log warnings from Hangfire
}
}
}
但您可能只想排除特定的邮件子集。我不确定心跳消息到底是什么命名空间,但你可以这样做:
{
"Logging": {
"LogLevel": {
...
"Hangfire": "Information", //Output information and above for all Hangfire logs
"Hangfire.Server.ServerWatchdog": "Warning" // but only warnings for the
// Hangfire.Server.ServerWatchdog namespace
}
}
}
HangFire 库中没有任何 OOB 选项。
正如 Camilo Terevinto
提到的,我能够实现以下解决方法。
public void ConfigureServices(IServiceCollection services)
{
// other service configuration goes here
if (IsHangfireJobsAllowed())
{
// HangFire configuration
var storage = HangFireJobs.GetHangFireStorageConnection(
config["CosmosDBEndpoint"],
config["CosmosDBAuthKey"],
config["CosmosDBDatabaseName"]);
// Add HangFire services.
services.AddHangfire(configuration => configuration
.SetDataCompatibilityLevel(CompatibilityLevel.Version_170)
.UseSimpleAssemblyNameTypeSerializer()
//.UseRecommendedSerializerSettings()
.UseSerializerSettings(new JsonSerializerSettings() { ReferenceLoopHandling = ReferenceLoopHandling.Ignore })
.UseStorage(storage));
// Add the processing server as IHostedService
services.AddHangfireServer();
GlobalJobFilters.Filters.Add(new AutomaticRetryAttribute { Attempts = 0 });
}
// other service configuration goes here
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IConfiguration config)
{
// Other code goes here
if (IsHangfireJobsAllowed())
{
app.UseHangfireDashboard("/hangfire");
// Custom code to schedule the recurring jobs
HangFireJobScheduler.ScheduleRecurringJobs();
}
// Other code follows here
}
private bool IsHangfireJobsAllowed()
{
// For QA and Prod env's add HangFire with out config dependency
if (!Environment.IsDevelopment())
return true;
// For Dev environment adding HangFire conditionally
// Ignoring return value since, the result will have 'true'
// only if the parsing is success and config has 'true'
bool.TryParse(Configuration["HangFire:RunJobsOnDev"], out bool result);
return result;
}
Camilo Terevinto
和DavidG
,谢谢你们。