Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,16 @@

<ItemGroup>
<PackageReference Include="NLog.Extensions.Logging" Version="6.1.3" />
<PackageReference Include="NServiceBus.AcceptanceTesting" Version="10.2.0" />
<PackageReference Include="NServiceBus.AcceptanceTests.Sources" Version="10.2.0" GeneratePathProperty="true" />
</ItemGroup>

<ItemGroup Condition="'$(PkgNServiceBus_AcceptanceTests_Sources)' != ''">
<Compile Remove="$(PkgNServiceBus_AcceptanceTests_Sources)\**\*.cs" />
<Compile Include="$(PkgNServiceBus_AcceptanceTests_Sources)\contentFiles\cs\$(TargetFramework)\**\EndpointTemplates\*.cs" />
<Compile Include="$(PkgNServiceBus_AcceptanceTests_Sources)\contentFiles\cs\$(TargetFramework)\**\ConfigureEndpointAcceptanceTestingTransport.cs" />
<Compile Include="$(PkgNServiceBus_AcceptanceTests_Sources)\contentFiles\cs\$(TargetFramework)\**\ConfigureEndpointAcceptanceTestingPersistence.cs" />
<Compile Include="$(PkgNServiceBus_AcceptanceTests_Sources)\contentFiles\cs\$(TargetFramework)\**\NServiceBusAcceptanceTest.cs" />
</ItemGroup>

</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
namespace NServiceBus.AcceptanceTests;

using AcceptanceTesting.Support;

public partial class TestSuiteConstraints
{
public bool SupportsDtc => false;
public bool SupportsCrossQueueTransactions => true;
public bool SupportsNativePubSub => false;
public bool SupportsDelayedDelivery => false;
public bool SupportsOutbox => true;
public bool SupportsPurgeOnStartup => true;

public IConfigureEndpointTestExecution CreateTransportConfiguration()
=> new ConfigureEndpointAcceptanceTestingTransport(SupportsNativePubSub, SupportsDelayedDelivery);

public IConfigureEndpointTestExecution CreatePersistenceConfiguration()
=> new ConfigureEndpointAcceptanceTestingPersistence();
}
Original file line number Diff line number Diff line change
@@ -1,43 +1,54 @@
namespace NServiceBus.Extensions.DependencyInjection.AcceptanceTests
namespace NServiceBus.Extensions.Logging.NLog.AcceptanceTests;

using System.Threading.Tasks;
using global::NLog.Config;
using global::NLog.Extensions.Logging;
using global::NLog.Targets;
using NUnit.Framework;
using NServiceBus.AcceptanceTesting;
using NServiceBus.AcceptanceTests;
using NServiceBus.AcceptanceTests.EndpointTemplates;
using NServiceBus.Logging;
using NLogLogManager = global::NLog.LogManager;
using NsbLogManager = NServiceBus.Logging.LogManager;

[NonParallelizable]
public class When_using_nlog_extension_logger : NServiceBusAcceptanceTest
{
using System.Threading.Tasks;
using Logging;
using NLog;
using NLog.Extensions.Logging;
using NUnit.Framework;
using NsbLogManager = NServiceBus.Logging.LogManager;

public class When_using_nlog_extension_logger
[Test]
public async Task Should_log_nsb_logs_through_nlog()
{
var memoryTarget = new MemoryTarget();
var config = new LoggingConfiguration();
config.AddRuleForAllLevels(memoryTarget);
NLogLogManager.Configuration = config;

await using var nlogLoggerFactory = new NLogLoggerFactory();

#pragma warning disable CS0618 // ExtensionsLoggerFactory is deprecated; test exercises legacy behavior intentionally
NsbLogManager.UseFactory(new ExtensionsLoggerFactory(nlogLoggerFactory));
#pragma warning restore CS0618

await Scenario.Define<Context>()
.WithEndpoint<EndpointUsingBridge>()
.Done(c => c.EndpointsStarted)
.Run();

Assert.That(memoryTarget.Logs, Is.Not.Empty);
}

[TearDown]
public void Teardown()
{
#pragma warning disable CS0618
NsbLogManager.Use<DefaultFactory>();
#pragma warning restore CS0618
}

class Context : ScenarioContext;

class EndpointUsingBridge : EndpointConfigurationBuilder
{
[Test]
public async Task Should_log_nsb_logs()
{
var config = new NLog.Config.LoggingConfiguration();
var memoryTarget = new NLog.Targets.MemoryTarget();
config.AddRuleForAllLevels(memoryTarget);
LogManager.Configuration = config;

NsbLogManager.UseFactory(new ExtensionsLoggerFactory(new NLogLoggerFactory()));

var endpointConfiguration = new EndpointConfiguration("LoggingTests");
endpointConfiguration.UseSerialization<SystemJsonSerializer>();
endpointConfiguration.EnableInstallers();
endpointConfiguration.SendFailedMessagesTo("error");
endpointConfiguration.UseTransport(new LearningTransport());
endpointConfiguration.UsePersistence<LearningPersistence>();

var endpoint = await Endpoint.Start(endpointConfiguration)
.ConfigureAwait(false);

try
{
Assert.That(memoryTarget.Logs, Is.Not.Empty);
}
finally
{
await endpoint.Stop()
.ConfigureAwait(false);
}
}
public EndpointUsingBridge() => EndpointSetup<DefaultServer>();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
#pragma warning disable CS0618 // Type or member is obsolete
namespace NServiceBus.Extensions.Logging.NLog.AcceptanceTests;

using System.Collections.Concurrent;
using System.Runtime.CompilerServices;
using System.Threading.Tasks;
using Configuration.AdvancedExtensibility;
using global::NLog.Config;
using global::NLog.Extensions.Logging;
using global::NLog.Targets;
using Microsoft.Extensions.DependencyInjection;
using NUnit.Framework;
using NServiceBus.AcceptanceTesting;
using NServiceBus.AcceptanceTests;
using NServiceBus.AcceptanceTests.EndpointTemplates;
using Settings;

[NonParallelizable]
public class When_using_nlog_with_register_components : NServiceBusAcceptanceTest
{
[Test]
public async Task Should_log_nsb_logs_through_nlog()
{
var memoryTarget = new MemoryTarget();
var config = new LoggingConfiguration();
config.AddRuleForAllLevels(memoryTarget);

await Scenario.Define<Context>()
.WithEndpoint<EndpointWithRegisterComponents>(b =>
{
b.CustomConfig(c => c.RegisterComponents(s => s.AddLogging(builder => builder.AddNLog(config))));
b.ToCreateInstance(
(_, configuration) =>
{
// The acceptance test infrastructure populates settings with the adapter which then makes RegisterComponent to be rerouted to the adapter
// in self-hosting scenarios this is never the case as the adapter is only used for multi-endpoint hosting, so we need to remove the adapter
// from settings to properly test the scenario but it allows us to use the acceptance test infrastructure to create the endpoint instance and
// start it which is required to properly test the scenario
RemoveOverride(configuration.GetSettings(), "NServiceBus.KeyedServiceCollectionAdapter");
return Endpoint.Create(configuration);
},
async (startableEndpoint, _, ct) =>
{
var endpoint = await startableEndpoint.Start(ct);
return endpoint.Stop;
});
})
.Done(c => c.EndpointsStarted)
.Run();

Assert.That(memoryTarget.Logs, Is.Not.Empty);
}

[UnsafeAccessor(UnsafeAccessorKind.Field, Name = "Overrides")]
static extern ref ConcurrentDictionary<string, object> GetOverrides(SettingsHolder settingsHolder);

static void RemoveOverride(SettingsHolder settingsHolder, string key) => GetOverrides(settingsHolder).TryRemove(key, out _);

class Context : ScenarioContext;

class EndpointWithRegisterComponents : EndpointConfigurationBuilder
{
public EndpointWithRegisterComponents() => EndpointSetup<DefaultServer>();
}
}
#pragma warning restore CS0618
10 changes: 8 additions & 2 deletions src/NServiceBus.Extensions.Logging.Tests/APIApprovals.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,17 @@ public class APIApprovals
[Test]
public void Approve_NServiceBusExtensionsLogging()
{
#pragma warning disable CS0618 // Type or member is obsolete
var publicApi = typeof(ExtensionsLoggerFactory).Assembly.GeneratePublicApi(new ApiGeneratorOptions
#pragma warning restore CS0618 // Type or member is obsolete
{
ExcludeAttributes = new[] { "System.Runtime.Versioning.TargetFrameworkAttribute", "System.Reflection.AssemblyMetadataAttribute" }
ExcludeAttributes =
[
"System.Runtime.Versioning.TargetFrameworkAttribute",
"System.Reflection.AssemblyMetadataAttribute",
]
});
Approver.Verify(publicApi);
}
}
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
namespace NServiceBus.Extensions.Logging
{
[System.Obsolete(@"The logging bridge is no longer required. NServiceBus natively uses Microsoft.Extensions.Logging. When using 'AddNServiceBusEndpoint', configure logging on the host builder. For self-hosting with 'Endpoint.Start', use 'RegisterComponents(s => s.AddLogging(builder => builder.AddNLog() / builder.AddSerilog() / etc.))' instead and remove this package reference. 'RegisterComponents' is also deprecated but CS0618 may be suppressed as a migration step until all service registrations are moved to a host-managed service collection. Will be treated as an error from version 5.0.0. Will be removed in version 6.0.0.", false)]
public class ExtensionsLoggerFactory : NServiceBus.Logging.ILoggerFactory
{
public ExtensionsLoggerFactory(Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) { }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,18 @@ namespace NServiceBus.Extensions.Logging
{
using System;
using NServiceBus.Logging;
using Particular.Obsoletes;

/// <summary>
/// Usage:
/// ILoggerFactory extensionsLoggingFactory = ...;
/// LogManager.UseFactory(new ExtensionsLoggerFactory(extensionsLoggingFactory));
/// </summary>
[ObsoleteMetadata(
Message = "The logging bridge is no longer required. NServiceBus natively uses Microsoft.Extensions.Logging. When using 'AddNServiceBusEndpoint', configure logging on the host builder. For self-hosting with 'Endpoint.Start', use 'RegisterComponents(s => s.AddLogging(builder => builder.AddNLog() / builder.AddSerilog() / etc.))' instead and remove this package reference. 'RegisterComponents' is also deprecated but CS0618 may be suppressed as a migration step until all service registrations are moved to a host-managed service collection.",
TreatAsErrorFromVersion = "5",
RemoveInVersion = "6")]
[Obsolete("The logging bridge is no longer required. NServiceBus natively uses Microsoft.Extensions.Logging. When using 'AddNServiceBusEndpoint', configure logging on the host builder. For self-hosting with 'Endpoint.Start', use 'RegisterComponents(s => s.AddLogging(builder => builder.AddNLog() / builder.AddSerilog() / etc.))' instead and remove this package reference. 'RegisterComponents' is also deprecated but CS0618 may be suppressed as a migration step until all service registrations are moved to a host-managed service collection. Will be treated as an error from version 5.0.0. Will be removed in version 6.0.0.", false)]
public class ExtensionsLoggerFactory : ILoggerFactory
{
/// <summary>
Expand All @@ -34,4 +40,4 @@ public ILog GetLogger(Type type)

readonly Microsoft.Extensions.Logging.ILoggerFactory loggerFactory;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,11 @@

<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="10.0.8" AutomaticVersionRange="false" />
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we still need this one? (core will bring it)

<PackageReference Include="NServiceBus" Version="10.1.4" />
<PackageReference Include="NServiceBus" Version="10.2.0" />
</ItemGroup>

<ItemGroup>
<PackageReference Include="Particular.Obsoletes" Version="1.1.0" PrivateAssets="All" ExcludeAssets="runtime" />
<PackageReference Include="Particular.Packaging" Version="4.5.0" PrivateAssets="All" />
</ItemGroup>

Expand Down
Loading