Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
a8c746f
convert SC transports from NServiceBus.Logging to Microsoft.Extension…
PhilBastian Jun 12, 2025
42d01e7
remove signedassembly requirement so that infrastructure can be imported
PhilBastian Jun 15, 2025
96ec124
revert previous change and instead propogate signing back to servicec…
PhilBastian Jun 15, 2025
5aaabe6
fix signature of customisation classes that are dynamically created
PhilBastian Jun 16, 2025
67920ff
add ilogger to test services and remove direct construction with logger
PhilBastian Jun 16, 2025
b3c690a
get tests to use ilogger
PhilBastian Jun 16, 2025
66aaa02
Switch to .NET logging
jasontaylordev Jun 10, 2025
e2196e6
Work in progress
jasontaylordev Jun 12, 2025
e9f287e
Remove test code
jasontaylordev Jun 13, 2025
9b97c92
Improve logging format for storage space details
jasontaylordev Jun 17, 2025
005968d
Properly shutdown NLog in Program.cs
jasontaylordev Jun 17, 2025
49ba86c
Remove Seq logging and prepare for .NET logging migration
jasontaylordev Jun 17, 2025
938c963
Update LogLevel format
jasontaylordev Jun 17, 2025
fb7f77e
Update LogLevel format in logging settings
jasontaylordev Jun 17, 2025
6c713bb
Merge branch 'master' into extensions.logging_transports
PhilBastian Jun 17, 2025
40eef99
Merge branch 'logging-spike-jt' into extensions.logging_transports
PhilBastian Jun 17, 2025
07d5606
enable adding test logging provider as part of loggerutils and create…
PhilBastian Jun 17, 2025
a843701
add ability to select logging provider from config
PhilBastian Jun 17, 2025
3e59886
handle setting not existing
PhilBastian Jun 17, 2025
ab580f6
change logmanager logger factory to the standard one now used by the …
PhilBastian Jun 17, 2025
3e16970
ensure logger for transport tests
PhilBastian Jun 18, 2025
2f1f578
Merge branch 'extensions.logging_spike' into extensions.logging_trans…
PhilBastian Jun 18, 2025
18604ca
Merge branch 'extensions.logging_spike' into extensions.logging_trans…
PhilBastian Jun 18, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 8 additions & 9 deletions src/ServiceControl.Transports.ASBS/DeadLetterQueueCheck.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,15 @@
using System.Threading;
using System.Threading.Tasks;
using Azure.Messaging.ServiceBus.Administration;
using Microsoft.Extensions.Logging;
using NServiceBus.CustomChecks;
using NServiceBus.Logging;
using ServiceControl.Infrastructure;

public class DeadLetterQueueCheck : CustomCheck
{
public DeadLetterQueueCheck(TransportSettings settings) : base(id: "Dead Letter Queue", category: "Transport", repeatAfter: TimeSpan.FromHours(1))
{
Logger.Debug("Azure Service Bus Dead Letter Queue custom check starting");
Logger.LogDebug("Azure Service Bus Dead Letter Queue custom check starting");

connectionString = settings.ConnectionString;
stagingQueue = $"{settings.EndpointName}.staging";
Expand All @@ -25,21 +26,19 @@ public override async Task<CheckResult> PerformCheck(CancellationToken cancellat
return CheckResult.Pass;
}

Logger.Debug("Checking Dead Letter Queue length");
Logger.LogDebug("Checking Dead Letter Queue length");
var managementClient = new ServiceBusAdministrationClient(connectionString);

var queueRuntimeInfo = await managementClient.GetQueueRuntimePropertiesAsync(stagingQueue, cancellationToken);
var deadLetterMessageCount = queueRuntimeInfo.Value.DeadLetterMessageCount;

if (deadLetterMessageCount > 0)
{
var result = $"{deadLetterMessageCount} messages in the Dead Letter Queue '{stagingQueue}'. This could indicate a problem with ServiceControl's retries. Please submit a support ticket to Particular if you would like help from our engineers to ensure no message loss while resolving these dead letter messages.";

Logger.Warn(result);
return CheckResult.Failed(result);
Logger.LogWarning("{DeadLetterMessageCount} messages in the Dead Letter Queue '{StagingQueue}'. This could indicate a problem with ServiceControl's retries. Please submit a support ticket to Particular if you would like help from our engineers to ensure no message loss while resolving these dead letter messages.", deadLetterMessageCount, stagingQueue);
return CheckResult.Failed($"{deadLetterMessageCount} messages in the Dead Letter Queue '{stagingQueue}'. This could indicate a problem with ServiceControl's retries. Please submit a support ticket to Particular if you would like help from our engineers to ensure no message loss while resolving these dead letter messages.");
}

Logger.Debug("No messages in Dead Letter Queue");
Logger.LogDebug("No messages in Dead Letter Queue");

return CheckResult.Pass;
}
Expand All @@ -49,6 +48,6 @@ public override async Task<CheckResult> PerformCheck(CancellationToken cancellat
bool runCheck;


static readonly ILog Logger = LogManager.GetLogger(typeof(DeadLetterQueueCheck));
static readonly ILogger Logger = LoggerUtil.CreateStaticLogger(typeof(DeadLetterQueueCheck));
}
}
16 changes: 8 additions & 8 deletions src/ServiceControl.Transports.ASBS/QueueLengthProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,17 +6,18 @@ namespace ServiceControl.Transports.ASBS
using System.Threading;
using System.Threading.Tasks;
using Azure.Messaging.ServiceBus.Administration;
using NServiceBus.Logging;
using Microsoft.Extensions.Logging;

class QueueLengthProvider : AbstractQueueLengthProvider
{
public QueueLengthProvider(TransportSettings settings, Action<QueueLengthEntry[], EndpointToQueueMapping> store) : base(settings, store)
public QueueLengthProvider(TransportSettings settings, Action<QueueLengthEntry[], EndpointToQueueMapping> store, ILogger<QueueLengthProvider> logger) : base(settings, store)
{
var connectionSettings = ConnectionStringParser.Parse(ConnectionString);

queryDelayInterval = connectionSettings.QueryDelayInterval ?? TimeSpan.FromMilliseconds(500);

managementClient = connectionSettings.AuthenticationMethod.BuildManagementClient();
this.logger = logger;
}

public override void TrackEndpointInputQueue(EndpointToQueueMapping queueToTrack) =>
Expand All @@ -32,14 +33,14 @@ protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
try
{
Logger.Debug("Waiting for next interval");
logger.LogDebug("Waiting for next interval");
await Task.Delay(queryDelayInterval, stoppingToken);

Logger.DebugFormat("Querying management client.");
logger.LogDebug("Querying management client.");

var queueRuntimeInfos = await GetQueueList(stoppingToken);

Logger.DebugFormat("Retrieved details of {0} queues", queueRuntimeInfos.Count);
logger.LogDebug("Retrieved details of {QueueCount} queues", queueRuntimeInfos.Count);

UpdateAllQueueLengths(queueRuntimeInfos);
}
Expand All @@ -49,7 +50,7 @@ protected override async Task ExecuteAsync(CancellationToken stoppingToken)
}
catch (Exception e)
{
Logger.Error("Error querying Azure Service Bus queue sizes.", e);
logger.LogError(e, "Error querying Azure Service Bus queue sizes.");
}
}
}
Expand Down Expand Up @@ -109,7 +110,6 @@ void UpdateQueueLength(KeyValuePair<string, string> monitoredEndpoint, IReadOnly
readonly ConcurrentDictionary<string, string> endpointQueueMappings = new ConcurrentDictionary<string, string>();
readonly ServiceBusAdministrationClient managementClient;
readonly TimeSpan queryDelayInterval;

static readonly ILog Logger = LogManager.GetLogger<QueueLengthProvider>();
readonly ILogger<QueueLengthProvider> logger;
}
}
19 changes: 11 additions & 8 deletions src/ServiceControl.Transports.ASQ/QueueLengthProvider.cs
Original file line number Diff line number Diff line change
@@ -1,19 +1,22 @@
namespace ServiceControl.Transports.ASQ
{
using System;
using System.Linq;
using System.Threading.Tasks;
using System.Collections.Concurrent;
using System.Linq;
using System.Threading;
using NServiceBus.Logging;
using System.Threading.Tasks;
using Azure.Storage.Queues;
using Azure.Storage.Queues.Models;
using Microsoft.Extensions.Logging;

class QueueLengthProvider : AbstractQueueLengthProvider
{
public QueueLengthProvider(TransportSettings settings, Action<QueueLengthEntry[], EndpointToQueueMapping> store)
public QueueLengthProvider(TransportSettings settings, Action<QueueLengthEntry[], EndpointToQueueMapping> store, ILogger<QueueLengthProvider> logger)
: base(settings, store)
=> connectionString = ConnectionString.RemoveCustomConnectionStringParts(out _);
{
connectionString = ConnectionString.RemoveCustomConnectionStringParts(out _);
this.logger = logger;
}

public override void TrackEndpointInputQueue(EndpointToQueueMapping queueToTrack)
{
Expand Down Expand Up @@ -48,7 +51,7 @@ protected override async Task ExecuteAsync(CancellationToken stoppingToken)
}
catch (Exception e)
{
Logger.Error("Error querying sql queue sizes.", e);
logger.LogError(e, "Error querying sql queue sizes.");
}
}
}
Expand Down Expand Up @@ -76,7 +79,7 @@ async Task FetchLength(QueueLengthValue queueLength, CancellationToken cancellat
// simple "log once" approach to do not flood logs
if (problematicQueuesNames.TryAdd(queueLength.QueueName, queueLength.QueueName))
{
Logger.Error($"Obtaining Azure Storage Queue count failed for '{queueLength.QueueName}'", ex);
logger.LogError(ex, "Obtaining Azure Storage Queue count failed for '{QueueName}'", queueLength.QueueName);
}
}
}
Expand All @@ -102,7 +105,7 @@ void UpdateQueueLengthStore()
readonly ConcurrentDictionary<EndpointToQueueMapping, QueueLengthValue> queueLengths = new ConcurrentDictionary<EndpointToQueueMapping, QueueLengthValue>();
readonly ConcurrentDictionary<string, string> problematicQueuesNames = new ConcurrentDictionary<string, string>();

static readonly ILog Logger = LogManager.GetLogger<QueueLengthProvider>();
readonly ILogger<QueueLengthProvider> logger;
static readonly TimeSpan QueryDelayInterval = TimeSpan.FromMilliseconds(200);

class QueueLengthValue
Expand Down
15 changes: 9 additions & 6 deletions src/ServiceControl.Transports.Learning/QueueLengthProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,17 @@
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using NServiceBus.Logging;
using Microsoft.Extensions.Logging;
using ServiceControl.Transports.Learning;

class QueueLengthProvider : AbstractQueueLengthProvider
{
public QueueLengthProvider(TransportSettings settings, Action<QueueLengthEntry[], EndpointToQueueMapping> store)
: base(settings, store) =>
public QueueLengthProvider(TransportSettings settings, Action<QueueLengthEntry[], EndpointToQueueMapping> store, ILogger<QueueLengthProvider> logger)
: base(settings, store)
{
rootFolder = LearningTransportCustomization.FindStoragePath(ConnectionString);
this.logger = logger;
}

public override void TrackEndpointInputQueue(EndpointToQueueMapping queueToTrack)
=> endpointsHash.AddOrUpdate(queueToTrack, queueToTrack, (_, __) => queueToTrack);
Expand All @@ -36,7 +39,7 @@ protected override async Task ExecuteAsync(CancellationToken stoppingToken)
}
catch (Exception ex)
{
Log.Warn("Problem getting learning transport queue length", ex);
logger.LogWarning(ex, "Problem getting learning transport queue length");
}
}
}
Expand All @@ -60,7 +63,7 @@ void UpdateStore(ILookup<string, long?> queueLengths)
}
else
{
Log.Warn($"Queue Length data missing for queue {instance.InputQueue} (Endpoint {instance.EndpointName})");
logger.LogWarning("Queue Length data missing for queue {InputQueue} (Endpoint {EndpointName})", instance.InputQueue, instance.EndpointName);
}
}
}
Expand All @@ -87,7 +90,7 @@ void UpdateStore(ILookup<string, long?> queueLengths)
readonly ConcurrentDictionary<EndpointToQueueMapping, EndpointToQueueMapping> endpointsHash = new ConcurrentDictionary<EndpointToQueueMapping, EndpointToQueueMapping>();

static readonly TimeSpan QueryDelayInterval = TimeSpan.FromMilliseconds(200);
static readonly ILog Log = LogManager.GetLogger<QueueLengthProvider>();
readonly ILogger<QueueLengthProvider> logger;

}
}
32 changes: 13 additions & 19 deletions src/ServiceControl.Transports.Msmq/DeadLetterQueueCheck.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,13 @@
using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
using NServiceBus.CustomChecks;
using NServiceBus.Logging;
using Transports;

public class DeadLetterQueueCheck : CustomCheck
{
public DeadLetterQueueCheck(TransportSettings settings) :
public DeadLetterQueueCheck(TransportSettings settings, ILogger<DeadLetterQueueCheck> logger) :
base("Dead Letter Queue", "Transport", TimeSpan.FromHours(1))
{
runCheck = settings.RunCustomChecks;
Expand All @@ -20,7 +20,7 @@ public DeadLetterQueueCheck(TransportSettings settings) :
return;
}

Logger.Debug("MSMQ Dead Letter Queue custom check starting");
logger.LogDebug("MSMQ Dead Letter Queue custom check starting");

categoryName = Read("Msmq/PerformanceCounterCategoryName", "MSMQ Queue");
counterName = Read("Msmq/PerformanceCounterName", "Messages in Queue");
Expand All @@ -32,8 +32,10 @@ public DeadLetterQueueCheck(TransportSettings settings) :
}
catch (InvalidOperationException ex)
{
Logger.Error(CounterMightBeLocalized(categoryName, counterName, counterInstanceName), ex);
logger.LogError(ex, CounterMightBeLocalized("CategoryName", "CounterName", "CounterInstanceName"), categoryName, counterName, counterInstanceName);
}

this.logger = logger;
}

public override Task<CheckResult> PerformCheck(CancellationToken cancellationToken = default)
Expand All @@ -43,9 +45,8 @@ public override Task<CheckResult> PerformCheck(CancellationToken cancellationTok
return CheckResult.Pass;
}

Logger.Debug("Checking Dead Letter Queue length");
logger.LogDebug("Checking Dead Letter Queue length");
float currentValue;
string result;
try
{
if (dlqPerformanceCounter == null)
Expand All @@ -57,25 +58,18 @@ public override Task<CheckResult> PerformCheck(CancellationToken cancellationTok
}
catch (InvalidOperationException ex)
{
result = CounterMightBeLocalized(categoryName, counterName, counterInstanceName);
Logger.Warn(result, ex);
return CheckResult.Failed(result);
logger.LogWarning(ex, CounterMightBeLocalized("CategoryName", "CounterName", "CounterInstanceName"), categoryName, counterName, counterInstanceName);
return CheckResult.Failed(CounterMightBeLocalized(categoryName, counterName, counterInstanceName));
}

if (currentValue <= 0)
{
Logger.Debug("No messages in Dead Letter Queue");
logger.LogDebug("No messages in Dead Letter Queue");
return CheckResult.Pass;
}

result = MessagesInDeadLetterQueue(currentValue);
Logger.Warn(result);
return CheckResult.Failed(result);
}

static string MessagesInDeadLetterQueue(float currentValue)
{
return $"{currentValue} messages in the Dead Letter Queue on {Environment.MachineName}. This could indicate a problem with ServiceControl's retries. Please submit a support ticket to Particular if you would like help from our engineers to ensure no message loss while resolving these dead letter messages.";
logger.LogWarning("{DeadLetterMessageCount} messages in the Dead Letter Queue on {MachineName}. This could indicate a problem with ServiceControl's retries. Please submit a support ticket to Particular if you would like help from our engineers to ensure no message loss while resolving these dead letter messages.", currentValue, Environment.MachineName);
return CheckResult.Failed($"{currentValue} messages in the Dead Letter Queue on {Environment.MachineName}. This could indicate a problem with ServiceControl's retries. Please submit a support ticket to Particular if you would like help from our engineers to ensure no message loss while resolving these dead letter messages.");
}

static string CounterMightBeLocalized(string categoryName, string counterName, string counterInstanceName)
Expand Down Expand Up @@ -123,6 +117,6 @@ static bool TryRead(string root, string name, out string value)
string counterInstanceName;
bool runCheck;

static readonly ILog Logger = LogManager.GetLogger(typeof(DeadLetterQueueCheck));
readonly ILogger logger;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
{
using System;
using System.Threading.Tasks;
using ServiceControl.Infrastructure;
using ServiceControl.Transports.PostgreSql;
using Transports;

Expand All @@ -13,7 +14,7 @@ partial class TransportTestsConfiguration

public Task Configure()
{
TransportCustomization = new PostgreSqlTransportCustomization();
TransportCustomization = new PostgreSqlTransportCustomization(LoggerUtil.CreateStaticLogger<PostgreSqlTransportCustomization>());
ConnectionString = Environment.GetEnvironmentVariable(ConnectionStringKey);

if (string.IsNullOrEmpty(ConnectionString))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,11 @@
using System.Runtime.CompilerServices;
using BrokerThroughput;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using NServiceBus;
using NServiceBus.Logging;
using NServiceBus.Transport.PostgreSql;

public class PostgreSqlTransportCustomization : TransportCustomization<PostgreSqlTransport>
public class PostgreSqlTransportCustomization(ILogger<PostgreSqlTransportCustomization> logger) : TransportCustomization<PostgreSqlTransport>
{
protected override void CustomizeTransportForPrimaryEndpoint(EndpointConfiguration endpointConfiguration, PostgreSqlTransport transportDefinition, TransportSettings transportSettings)
{
Expand Down Expand Up @@ -66,7 +66,7 @@ protected override PostgreSqlTransport CreateTransport(TransportSettings transpo

if (transportSettings.GetOrDefault<bool>("TransportSettings.EnableDtc"))
{
Logger.Error("The EnableDtc setting is no longer supported natively within ServiceControl. If you require distributed transactions, you will have to use a Transport Adapter (https://docs.particular.net/servicecontrol/transport-adapter/)");
logger.LogError("The EnableDtc setting is no longer supported natively within ServiceControl. If you require distributed transactions, you will have to use a Transport Adapter (https://docs.particular.net/servicecontrol/transport-adapter/)");
}

DisableDelayedDelivery(transport) = true;
Expand All @@ -93,6 +93,4 @@ protected override string ToTransportQualifiedQueueNameCore(string queueName)
static extern ref bool DisableDelayedDelivery(PostgreSqlTransport transport);

const string DefaultSubscriptionTableName = "SubscriptionRouting";

static readonly ILog Logger = LogManager.GetLogger(typeof(PostgreSqlTransportCustomization));
}
11 changes: 6 additions & 5 deletions src/ServiceControl.Transports.PostgreSql/QueueLengthProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,17 +6,18 @@
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
using Npgsql;
using NServiceBus.Logging;

class QueueLengthProvider : AbstractQueueLengthProvider
{
public QueueLengthProvider(TransportSettings settings, Action<QueueLengthEntry[], EndpointToQueueMapping> store) : base(settings, store)
public QueueLengthProvider(TransportSettings settings, Action<QueueLengthEntry[], EndpointToQueueMapping> store, ILogger<QueueLengthProvider> logger) : base(settings, store)
{
connectionString = ConnectionString
.RemoveCustomConnectionStringParts(out var customSchema, out _);

defaultSchema = customSchema ?? "public";
this.logger = logger;
}
public override void TrackEndpointInputQueue(EndpointToQueueMapping queueToTrack)
{
Expand Down Expand Up @@ -55,7 +56,7 @@ protected override async Task ExecuteAsync(CancellationToken stoppingToken)
}
catch (Exception e)
{
Logger.Error("Error querying sql queue sizes.", e);
logger.LogError(e, "Error querying SQL queue sizes.");
}
}
}
Expand Down Expand Up @@ -113,7 +114,7 @@ async Task UpdateChunk(NpgsqlConnection connection, KeyValuePair<PostgreSqlTable

if (queueLength == -1)
{
Logger.Warn($"Table {chunkPair.Key} does not exist.");
logger.LogWarning("Table {TableName} does not exist.", chunkPair.Key);
}
else
{
Expand All @@ -130,7 +131,7 @@ async Task UpdateChunk(NpgsqlConnection connection, KeyValuePair<PostgreSqlTable
readonly string connectionString;
readonly string defaultSchema;

static readonly ILog Logger = LogManager.GetLogger<QueueLengthProvider>();
readonly ILogger<QueueLengthProvider> logger;

static readonly TimeSpan QueryDelayInterval = TimeSpan.FromMilliseconds(200);

Expand Down
Loading
Loading