Ошибка с Hangfire при использовании NLog

Итак, я пытаюсь заставить мое приложение отправлять строку в текстовый файл каждую минуту, поэтому в моем файле Global.asax.cs у меня есть такая настройка:

public class Startup
{

    public void Configuration(IAppBuilder app)
    {
        GlobalConfiguration.Configuration

            .UseSqlServerStorage("AppContext");

        app.UseHangfireDashboard();

        app.UseHangfireServer();

    }
}

public class HeartbeatSetup
{
    public static void Heartbeat()
    {
        var config = new NLog.Config.LoggingConfiguration();

        var logFile = new NLog.Targets.FileTarget() { FileName = "heartbeat.txt", Name = "logfile" };

        config.LoggingRules.Add(new NLog.Config.LoggingRule("*", LogLevel.Trace, logFile));

        NLog.LogManager.Configuration = config;

        var logger = NLog.LogManager.GetCurrentClassLogger();

        var currentTime = DateTime.Now.ToString();

        RecurringJob.AddOrUpdate("heartbeat", () => logger.Trace("Test"), Cron.Minutely);
    }
}

Таким образом, это создает задание нормально и запускается каждую минуту, но задание не завершается и выдает следующую ошибку:

Для этого объекта не определен конструктор без параметров.

Есть ли у кого-нибудь решение этого или альтернативный способ сделать это?


person GeorgeB    schedule 31.05.2018    source источник
comment
Альтернативой является использование правильного pub-sub вместо Hangfire. Однако, если Hangfire - единственный вариант для вас, вы можете попробовать обернуть материал для вашего вызова (с созданием и настройкой регистратора) как общедоступный статический метод без каких-либо параметров. Также посмотрите, как Hangfire хранит зарегистрированных делегатов в таблицах SqlServer. Это может дать вам представление о том, что является запускаемой целью вызова Hangfire.   -  person Chizh    schedule 31.05.2018


Ответы (1)


Поэтому я исправил это, сославшись на другой статический метод, созданный ниже:

public class HeartbeatSetup
{
    public static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
    public static void Heartbeat()
    {
        try
        {
            RecurringJob.AddOrUpdate("heartbeat", () => Fire(), Cron.Minutely);
        }
        catch (Exception ex)
        {
            logger.Fatal(ex, "error");
            throw;
        }
    }

    public static void Fire()
    {
        var config = new NLog.Config.LoggingConfiguration();

        var logFile = new NLog.Targets.FileTarget("logfile") { FileName = "heartbeat.txt" };

        config.AddRule(NLog.LogLevel.Info, NLog.LogLevel.Fatal, logFile);

        NLog.LogManager.Configuration = config;

        var currentTime = DateTime.Now.ToString();

        try
        {
            logger.Info(currentTime + " - beep");
        }
        catch (Exception ex)
        {
            logger.Fatal(ex + " - beeeeeeeeeeeeeeeeeeeeeeeeeeeeeep");
        }

    }
}
person GeorgeB    schedule 31.05.2018