在特定环境(本地主机)中禁用 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 TerevintoDavidG,谢谢你们。