@ -2,6 +2,7 @@
using NLog.Config ;
using NLog ;
using NLog.Targets ;
using NzbDrone.Common.Extensions ;
using NzbDrone.Core.Lifecycle ;
using NzbDrone.Core.Messaging.Commands ;
using NzbDrone.Core.Messaging.Events ;
@ -14,6 +15,8 @@ namespace NzbDrone.Core.ProgressMessaging
private readonly IManageCommandQueue _commandQueueManager ;
private static LoggingRule _rule ;
private const string REENTRY_LOCK = "ProgressMessagingLock" ;
public ProgressMessageTarget ( IEventAggregator eventAggregator , IManageCommandQueue commandQueueManager )
{
_eventAggregator = eventAggregator ;
@ -22,6 +25,8 @@ namespace NzbDrone.Core.ProgressMessaging
protected override void Write ( LogEventInfo logEvent )
{
if ( ! ReentryPreventionCheck ( ) ) return ;
var command = GetCurrentCommand ( ) ;
if ( IsClientMessage ( logEvent , command ) )
@ -29,6 +34,8 @@ namespace NzbDrone.Core.ProgressMessaging
_commandQueueManager . SetMessage ( command , logEvent . FormattedMessage ) ;
_eventAggregator . PublishEvent ( new CommandUpdatedEvent ( command ) ) ;
}
MappedDiagnosticsContext . Remove ( REENTRY_LOCK ) ;
}
private CommandModel GetCurrentCommand ( )
@ -53,6 +60,20 @@ namespace NzbDrone.Core.ProgressMessaging
return logEvent . Properties . ContainsKey ( "Status" ) ;
}
private bool ReentryPreventionCheck ( )
{
var reentryLock = MappedDiagnosticsContext . Get ( REENTRY_LOCK ) ;
var commandId = MappedDiagnosticsContext . Get ( "CommandId" ) ;
if ( reentryLock . IsNullOrWhiteSpace ( ) | | reentryLock ! = commandId )
{
MappedDiagnosticsContext . Set ( REENTRY_LOCK , MappedDiagnosticsContext . Get ( "CommandId" ) ) ;
return true ;
}
return false ;
}
public void Handle ( ApplicationStartedEvent message )
{
_rule = new LoggingRule ( "*" , LogLevel . Trace , this ) ;