diff --git a/Hangfire.Dashboard.JobLogs/GlobalConfigurationExtensions.cs b/Hangfire.Dashboard.JobLogs/GlobalConfigurationExtensions.cs index 6c88e8a..33c1bcd 100644 --- a/Hangfire.Dashboard.JobLogs/GlobalConfigurationExtensions.cs +++ b/Hangfire.Dashboard.JobLogs/GlobalConfigurationExtensions.cs @@ -1,4 +1,6 @@ -using System.Linq; +using System; +using System.Linq; +using System.Runtime.Caching; namespace Hangfire.Dashboard.JobLogs { @@ -7,6 +9,7 @@ namespace Hangfire.Dashboard.JobLogs /// public static class GlobalConfigurationExtensions { + static readonly ObjectCache renderedJobs = MemoryCache.Default; /// /// Configures Hangfire to use JobLogs. /// @@ -15,10 +18,27 @@ public static IGlobalConfiguration UseDashboardJobLogs(this IGlobalConfiguration { configuration.UseJobDetailsRenderer(100, dto => { + // avoid multiple renders for the same JobId + if (renderedJobs.Get(dto.JobId) != null) + { + return new NonEscapedString(string.Empty); + } + var jobStorageConnection = JobStorage.Current.GetConnection(); + var logString = "No Logs Found"; var logsMessages = jobStorageConnection.GetAllEntriesFromHash($"joblogs-jobId:{dto.JobId}"); - var logString = string.Join("
", logsMessages.Select(kvp => kvp.Value)); + if (logsMessages != null) + { + logString = string.Join("
", logsMessages.Where(kvp => kvp.Value != null).Select(kvp => kvp.Value)); + } + + // cache rendered JobId + var policy = new CacheItemPolicy + { + AbsoluteExpiration = new DateTimeOffset(DateTime.Now.AddSeconds(1)) + }; + renderedJobs.Set(dto.JobId, true, policy); return new NonEscapedString($"

Log messages

" + $"
{logString}
" + diff --git a/Hangfire.Dashboard.JobLogs/Hangfire.Dashboard.JobLogs.csproj b/Hangfire.Dashboard.JobLogs/Hangfire.Dashboard.JobLogs.csproj index 203ffbd..3f8969d 100644 --- a/Hangfire.Dashboard.JobLogs/Hangfire.Dashboard.JobLogs.csproj +++ b/Hangfire.Dashboard.JobLogs/Hangfire.Dashboard.JobLogs.csproj @@ -17,6 +17,7 @@ +