diff --git a/Build/MQTTnet.nuspec b/Build/MQTTnet.nuspec
index dc54c49d..6893d807 100644
--- a/Build/MQTTnet.nuspec
+++ b/Build/MQTTnet.nuspec
@@ -13,6 +13,7 @@
MQTTnet is a high performance .NET library for MQTT based communication. It provides a MQTT client and a MQTT server (broker) and supports v3.1.0, v3.1.1 and v5.0.0 of the MQTT protocol.
* [Core] Added all builders to the MQTT factory.
+* [Core] Removed global logger and refactored logging (BREAKING CHANGE!).
* [Client] Renamed _MqttClientConnectResult_ to _MqttClientConnectResult_ (BREAKING CHANGE!).
* [ManagedClient] Extended ReconnectAsync (thanks to @nvsnkv, #1202).
* [ManagedClient] Improved Amazon AWS support (thanks to @scottbrogden-iheartmedia, #1209).
@@ -26,6 +27,8 @@
* [Server] Refactored connection management code.
* [Server] Exposed more details in _MqttServerClientConnectedEventArgs_.
* [Server] Processing all pending messages before stopping (thanks to @AblEdge, #1234).
+* [Server] Added support for a custom exception handler in _MqttServerMultiThreadedApplicationMessageInterceptorDelegate_.
+* [Server] Removed logger from _MqttServerMultiThreadedApplicationMessageInterceptorDelegate_ (BREAKING CHANGE!).
* [MQTTnet.Server] Moved server project to a dedicated GitHub repository.
Git commit: $gitCommit
diff --git a/Source/MQTTnet.AspnetCore/Extensions/ServiceCollectionExtensions.cs b/Source/MQTTnet.AspnetCore/Extensions/ServiceCollectionExtensions.cs
index 7ad53f4c..683fe1cc 100644
--- a/Source/MQTTnet.AspnetCore/Extensions/ServiceCollectionExtensions.cs
+++ b/Source/MQTTnet.AspnetCore/Extensions/ServiceCollectionExtensions.cs
@@ -3,6 +3,7 @@ using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using MQTTnet.Adapter;
using MQTTnet.Diagnostics;
+using MQTTnet.Diagnostics.Logger;
using MQTTnet.Implementations;
using MQTTnet.Server;
@@ -61,7 +62,7 @@ namespace MQTTnet.AspNetCore.Extensions
private static IServiceCollection AddHostedMqttServer(this IServiceCollection services)
{
- var logger = new MqttNetLogger();
+ var logger = new MqttNetEventLogger();
services.AddSingleton(logger);
services.AddSingleton();
diff --git a/Source/MQTTnet.AspnetCore/MqttHostedServer.cs b/Source/MQTTnet.AspnetCore/MqttHostedServer.cs
index 7108c119..3a9c882d 100644
--- a/Source/MQTTnet.AspnetCore/MqttHostedServer.cs
+++ b/Source/MQTTnet.AspnetCore/MqttHostedServer.cs
@@ -4,14 +4,14 @@ using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.Hosting;
using MQTTnet.Adapter;
-using MQTTnet.Diagnostics;
+using MQTTnet.Diagnostics.Logger;
using MQTTnet.Server;
namespace MQTTnet.AspNetCore
{
- public class MqttHostedServer : MqttServer, IHostedService
+ public sealed class MqttHostedServer : MqttServer, IHostedService
{
- private readonly IMqttServerOptions _options;
+ readonly IMqttServerOptions _options;
public MqttHostedServer(IMqttServerOptions options, IEnumerable adapters, IMqttNetLogger logger)
: base(adapters, logger)
diff --git a/Source/MQTTnet.AspnetCore/MqttWebSocketServerAdapter.cs b/Source/MQTTnet.AspnetCore/MqttWebSocketServerAdapter.cs
index cec833eb..270305d1 100644
--- a/Source/MQTTnet.AspnetCore/MqttWebSocketServerAdapter.cs
+++ b/Source/MQTTnet.AspnetCore/MqttWebSocketServerAdapter.cs
@@ -1,12 +1,12 @@
using Microsoft.AspNetCore.Http;
using MQTTnet.Adapter;
-using MQTTnet.Diagnostics;
using MQTTnet.Formatter;
using MQTTnet.Implementations;
using MQTTnet.Server;
using System;
using System.Net.WebSockets;
using System.Threading.Tasks;
+using MQTTnet.Diagnostics.Logger;
namespace MQTTnet.AspNetCore
{
diff --git a/Source/MQTTnet.Extensions.ManagedClient/ManagedMqttClient.cs b/Source/MQTTnet.Extensions.ManagedClient/ManagedMqttClient.cs
index a9e9481f..6e1c1f54 100644
--- a/Source/MQTTnet.Extensions.ManagedClient/ManagedMqttClient.cs
+++ b/Source/MQTTnet.Extensions.ManagedClient/ManagedMqttClient.cs
@@ -13,6 +13,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
+using MQTTnet.Diagnostics.Logger;
namespace MQTTnet.Extensions.ManagedClient
{
@@ -33,7 +34,7 @@ namespace MQTTnet.Extensions.ManagedClient
readonly HashSet _unsubscriptions = new HashSet();
readonly SemaphoreSlim _subscriptionsQueuedSignal = new SemaphoreSlim(0);
- readonly IMqttNetScopedLogger _logger;
+ readonly MqttNetSourceLogger _logger;
readonly AsyncLock _messageQueueLock = new AsyncLock();
@@ -48,7 +49,7 @@ namespace MQTTnet.Extensions.ManagedClient
InternalClient = mqttClient ?? throw new ArgumentNullException(nameof(mqttClient));
if (logger == null) throw new ArgumentNullException(nameof(logger));
- _logger = logger.CreateScopedLogger(nameof(ManagedMqttClient));
+ _logger = logger.WithSource(nameof(ManagedMqttClient));
}
public bool IsConnected => InternalClient.IsConnected;
diff --git a/Source/MQTTnet.Extensions.ManagedClient/MqttFactoryExtensions.cs b/Source/MQTTnet.Extensions.ManagedClient/MqttFactoryExtensions.cs
index b0fd8827..10256c58 100644
--- a/Source/MQTTnet.Extensions.ManagedClient/MqttFactoryExtensions.cs
+++ b/Source/MQTTnet.Extensions.ManagedClient/MqttFactoryExtensions.cs
@@ -1,5 +1,5 @@
-using MQTTnet.Diagnostics;
-using System;
+using System;
+using MQTTnet.Diagnostics.Logger;
namespace MQTTnet.Extensions.ManagedClient
{
diff --git a/Source/MQTTnet.Extensions.WebSocket4Net/WebSocket4NetMqttClientAdapterFactory.cs b/Source/MQTTnet.Extensions.WebSocket4Net/WebSocket4NetMqttClientAdapterFactory.cs
index 63826532..e4e72cce 100644
--- a/Source/MQTTnet.Extensions.WebSocket4Net/WebSocket4NetMqttClientAdapterFactory.cs
+++ b/Source/MQTTnet.Extensions.WebSocket4Net/WebSocket4NetMqttClientAdapterFactory.cs
@@ -4,6 +4,7 @@ using MQTTnet.Diagnostics;
using MQTTnet.Formatter;
using MQTTnet.Implementations;
using System;
+using MQTTnet.Diagnostics.Logger;
namespace MQTTnet.Extensions.WebSocket4Net
{
diff --git a/Source/MQTTnet/Adapter/MqttChannelAdapter.cs b/Source/MQTTnet/Adapter/MqttChannelAdapter.cs
index 8e3e8ddf..8ca09964 100644
--- a/Source/MQTTnet/Adapter/MqttChannelAdapter.cs
+++ b/Source/MQTTnet/Adapter/MqttChannelAdapter.cs
@@ -11,6 +11,7 @@ using System.Runtime.InteropServices;
using System.Security.Cryptography.X509Certificates;
using System.Threading;
using System.Threading.Tasks;
+using MQTTnet.Diagnostics.Logger;
using MQTTnet.Diagnostics.PacketInspection;
namespace MQTTnet.Adapter
@@ -24,7 +25,7 @@ namespace MQTTnet.Adapter
readonly byte[] _fixedHeaderBuffer = new byte[2];
readonly MqttPacketInspectorHandler _packetInspectorHandler;
- readonly IMqttNetScopedLogger _logger;
+ readonly MqttNetSourceLogger _logger;
readonly IMqttChannel _channel;
readonly AsyncLock _syncRoot = new AsyncLock();
@@ -40,7 +41,7 @@ namespace MQTTnet.Adapter
_packetInspectorHandler = new MqttPacketInspectorHandler(packetInspector, logger);
if (logger == null) throw new ArgumentNullException(nameof(logger));
- _logger = logger.CreateScopedLogger(nameof(MqttChannelAdapter));
+ _logger = logger.WithSource(nameof(MqttChannelAdapter));
}
public string Endpoint => _channel.Endpoint;
diff --git a/Source/MQTTnet/Adapter/MqttPacketInspectorHandler.cs b/Source/MQTTnet/Adapter/MqttPacketInspectorHandler.cs
index f8048d91..04eb2603 100644
--- a/Source/MQTTnet/Adapter/MqttPacketInspectorHandler.cs
+++ b/Source/MQTTnet/Adapter/MqttPacketInspectorHandler.cs
@@ -2,6 +2,7 @@ using System;
using System.IO;
using System.Linq;
using MQTTnet.Diagnostics;
+using MQTTnet.Diagnostics.Logger;
using MQTTnet.Diagnostics.PacketInspection;
namespace MQTTnet.Adapter
@@ -10,7 +11,7 @@ namespace MQTTnet.Adapter
{
readonly MemoryStream _receivedPacketBuffer;
readonly IMqttPacketInspector _packetInspector;
- readonly IMqttNetScopedLogger _logger;
+ readonly MqttNetSourceLogger _logger;
public MqttPacketInspectorHandler(IMqttPacketInspector packetInspector, IMqttNetLogger logger)
{
@@ -22,7 +23,7 @@ namespace MQTTnet.Adapter
}
if (logger == null) throw new ArgumentNullException(nameof(logger));
- _logger = logger.CreateScopedLogger(nameof(MqttPacketInspectorHandler));
+ _logger = logger.WithSource(nameof(MqttPacketInspectorHandler));
}
public void BeginReceivePacket()
diff --git a/Source/MQTTnet/Client/IMqttClientFactory.cs b/Source/MQTTnet/Client/IMqttClientFactory.cs
index 4bbb79a3..48314565 100644
--- a/Source/MQTTnet/Client/IMqttClientFactory.cs
+++ b/Source/MQTTnet/Client/IMqttClientFactory.cs
@@ -1,5 +1,6 @@
using MQTTnet.Adapter;
using MQTTnet.Diagnostics;
+using MQTTnet.Diagnostics.Logger;
using MQTTnet.LowLevelClient;
namespace MQTTnet.Client
diff --git a/Source/MQTTnet/Client/MqttClient.cs b/Source/MQTTnet/Client/MqttClient.cs
index 067f54f0..781ddd0c 100644
--- a/Source/MQTTnet/Client/MqttClient.cs
+++ b/Source/MQTTnet/Client/MqttClient.cs
@@ -16,6 +16,7 @@ using MQTTnet.Protocol;
using System;
using System.Threading;
using System.Threading.Tasks;
+using MQTTnet.Diagnostics.Logger;
using MQTTnet.Implementations;
namespace MQTTnet.Client
@@ -27,7 +28,7 @@ namespace MQTTnet.Client
readonly object _disconnectLock = new object();
readonly IMqttClientAdapterFactory _adapterFactory;
- readonly IMqttNetScopedLogger _logger;
+ readonly MqttNetSourceLogger _logger;
CancellationTokenSource _backgroundCancellationTokenSource;
Task _packetReceiverTask;
@@ -49,7 +50,7 @@ namespace MQTTnet.Client
if (logger == null) throw new ArgumentNullException(nameof(logger));
_adapterFactory = channelFactory ?? throw new ArgumentNullException(nameof(channelFactory));
- _logger = logger.CreateScopedLogger(nameof(MqttClient));
+ _logger = logger.WithSource(nameof(MqttClient));
}
public IMqttClientConnectedHandler ConnectedHandler { get; set; }
diff --git a/Source/MQTTnet/Diagnostics/IMqttNetScopedLogger.cs b/Source/MQTTnet/Diagnostics/IMqttNetScopedLogger.cs
deleted file mode 100644
index 14bb7564..00000000
--- a/Source/MQTTnet/Diagnostics/IMqttNetScopedLogger.cs
+++ /dev/null
@@ -1,11 +0,0 @@
-using System;
-
-namespace MQTTnet.Diagnostics
-{
- public interface IMqttNetScopedLogger
- {
- IMqttNetScopedLogger CreateScopedLogger(string source);
-
- void Publish(MqttNetLogLevel logLevel, string message, object[] parameters, Exception exception);
- }
-}
diff --git a/Source/MQTTnet/Diagnostics/IMqttNetLogger.cs b/Source/MQTTnet/Diagnostics/Logger/IMqttNetLogger.cs
similarity index 66%
rename from Source/MQTTnet/Diagnostics/IMqttNetLogger.cs
rename to Source/MQTTnet/Diagnostics/Logger/IMqttNetLogger.cs
index e0637abb..c96ee640 100644
--- a/Source/MQTTnet/Diagnostics/IMqttNetLogger.cs
+++ b/Source/MQTTnet/Diagnostics/Logger/IMqttNetLogger.cs
@@ -1,11 +1,9 @@
using System;
-namespace MQTTnet.Diagnostics
+namespace MQTTnet.Diagnostics.Logger
{
public interface IMqttNetLogger
{
- IMqttNetScopedLogger CreateScopedLogger(string source);
-
void Publish(MqttNetLogLevel logLevel, string source, string message, object[] parameters, Exception exception);
}
}
diff --git a/Source/MQTTnet/Diagnostics/Logger/MqttNetEventLogger.cs b/Source/MQTTnet/Diagnostics/Logger/MqttNetEventLogger.cs
new file mode 100644
index 00000000..bbf914a3
--- /dev/null
+++ b/Source/MQTTnet/Diagnostics/Logger/MqttNetEventLogger.cs
@@ -0,0 +1,58 @@
+using System;
+
+namespace MQTTnet.Diagnostics.Logger
+{
+ ///
+ /// This logger fires an event when a new message was published.
+ ///
+ public sealed class MqttNetEventLogger : IMqttNetLogger
+ {
+ public MqttNetEventLogger(string logId = null)
+ {
+ LogId = logId;
+ }
+
+ public event EventHandler LogMessagePublished;
+
+ public string LogId { get; }
+
+ public void Publish(MqttNetLogLevel level, string source, string message, object[] parameters, Exception exception)
+ {
+ var eventHandler = LogMessagePublished;
+ if (eventHandler == null)
+ {
+ // No listener is attached so we can step out.
+ // Keep a reference to the handler because the handler
+ // might be null after preparing the message.
+ return;
+ }
+
+ if (parameters?.Length > 0 && message?.Length > 0)
+ {
+ try
+ {
+ message = string.Format(message, parameters);
+ }
+ catch (FormatException)
+ {
+ message = "MESSAGE FORMAT INVALID: " + message;
+ }
+ }
+
+ // We only use UTC here to improve performance. Using a local date time
+ // would require to load the time zone settings!
+ var logMessage = new MqttNetLogMessage
+ {
+ LogId = LogId,
+ Timestamp = DateTime.UtcNow,
+ Source = source,
+ ThreadId = Environment.CurrentManagedThreadId,
+ Level = level,
+ Message = message,
+ Exception = exception
+ };
+
+ eventHandler.Invoke(this, new MqttNetLogMessagePublishedEventArgs(logMessage));
+ }
+ }
+}
\ No newline at end of file
diff --git a/Source/MQTTnet/Diagnostics/MqttNetLogLevel.cs b/Source/MQTTnet/Diagnostics/Logger/MqttNetLogLevel.cs
similarity index 73%
rename from Source/MQTTnet/Diagnostics/MqttNetLogLevel.cs
rename to Source/MQTTnet/Diagnostics/Logger/MqttNetLogLevel.cs
index cdc7a78a..f4b07b73 100644
--- a/Source/MQTTnet/Diagnostics/MqttNetLogLevel.cs
+++ b/Source/MQTTnet/Diagnostics/Logger/MqttNetLogLevel.cs
@@ -1,4 +1,4 @@
-namespace MQTTnet.Diagnostics
+namespace MQTTnet.Diagnostics.Logger
{
public enum MqttNetLogLevel
{
diff --git a/Source/MQTTnet/Diagnostics/MqttNetLogMessage.cs b/Source/MQTTnet/Diagnostics/Logger/MqttNetLogMessage.cs
similarity index 95%
rename from Source/MQTTnet/Diagnostics/MqttNetLogMessage.cs
rename to Source/MQTTnet/Diagnostics/Logger/MqttNetLogMessage.cs
index 285dc00e..8d3b06cb 100644
--- a/Source/MQTTnet/Diagnostics/MqttNetLogMessage.cs
+++ b/Source/MQTTnet/Diagnostics/Logger/MqttNetLogMessage.cs
@@ -1,6 +1,6 @@
using System;
-namespace MQTTnet.Diagnostics
+namespace MQTTnet.Diagnostics.Logger
{
public sealed class MqttNetLogMessage
{
diff --git a/Source/MQTTnet/Diagnostics/MqttNetLogMessagePublishedEventArgs.cs b/Source/MQTTnet/Diagnostics/Logger/MqttNetLogMessagePublishedEventArgs.cs
similarity index 53%
rename from Source/MQTTnet/Diagnostics/MqttNetLogMessagePublishedEventArgs.cs
rename to Source/MQTTnet/Diagnostics/Logger/MqttNetLogMessagePublishedEventArgs.cs
index 81ad62d0..581921dd 100644
--- a/Source/MQTTnet/Diagnostics/MqttNetLogMessagePublishedEventArgs.cs
+++ b/Source/MQTTnet/Diagnostics/Logger/MqttNetLogMessagePublishedEventArgs.cs
@@ -1,21 +1,14 @@
using System;
-namespace MQTTnet.Diagnostics
+namespace MQTTnet.Diagnostics.Logger
{
public sealed class MqttNetLogMessagePublishedEventArgs : EventArgs
{
public MqttNetLogMessagePublishedEventArgs(MqttNetLogMessage logMessage)
{
LogMessage = logMessage ?? throw new ArgumentNullException(nameof(logMessage));
-
-#pragma warning disable CS0618 // Type or member is obsolete
- TraceMessage = logMessage;
-#pragma warning restore CS0618 // Type or member is obsolete
}
- [Obsolete("Use new property LogMessage instead.")]
- public MqttNetLogMessage TraceMessage { get; }
-
public MqttNetLogMessage LogMessage { get; }
}
}
diff --git a/Source/MQTTnet/Diagnostics/Logger/MqttNetNullLogger.cs b/Source/MQTTnet/Diagnostics/Logger/MqttNetNullLogger.cs
new file mode 100644
index 00000000..806fd346
--- /dev/null
+++ b/Source/MQTTnet/Diagnostics/Logger/MqttNetNullLogger.cs
@@ -0,0 +1,14 @@
+using System;
+
+namespace MQTTnet.Diagnostics.Logger
+{
+ ///
+ /// This logger does nothing with the messages.
+ ///
+ public sealed class MqttNetNullLogger : IMqttNetLogger
+ {
+ public void Publish(MqttNetLogLevel logLevel, string source, string message, object[] parameters, Exception exception)
+ {
+ }
+ }
+}
\ No newline at end of file
diff --git a/Source/MQTTnet/Diagnostics/MqttNetScopedLogger.cs b/Source/MQTTnet/Diagnostics/Logger/MqttNetSourceLogger.cs
similarity index 52%
rename from Source/MQTTnet/Diagnostics/MqttNetScopedLogger.cs
rename to Source/MQTTnet/Diagnostics/Logger/MqttNetSourceLogger.cs
index 7b16db55..4b76ddf0 100644
--- a/Source/MQTTnet/Diagnostics/MqttNetScopedLogger.cs
+++ b/Source/MQTTnet/Diagnostics/Logger/MqttNetSourceLogger.cs
@@ -1,21 +1,16 @@
using System;
-namespace MQTTnet.Diagnostics
+namespace MQTTnet.Diagnostics.Logger
{
- public sealed class MqttNetScopedLogger : IMqttNetScopedLogger
+ public sealed class MqttNetSourceLogger
{
readonly IMqttNetLogger _logger;
readonly string _source;
- public MqttNetScopedLogger(IMqttNetLogger logger, string source)
+ public MqttNetSourceLogger(IMqttNetLogger logger, string source)
{
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
- _source = source ?? throw new ArgumentNullException(nameof(source));
- }
-
- public IMqttNetScopedLogger CreateScopedLogger(string source)
- {
- return new MqttNetScopedLogger(_logger, source);
+ _source = source;
}
public void Publish(MqttNetLogLevel logLevel, string message, object[] parameters, Exception exception)
diff --git a/Source/MQTTnet/Diagnostics/Logger/MqttNetSourceLoggerExtensions.cs b/Source/MQTTnet/Diagnostics/Logger/MqttNetSourceLoggerExtensions.cs
new file mode 100644
index 00000000..e92c860d
--- /dev/null
+++ b/Source/MQTTnet/Diagnostics/Logger/MqttNetSourceLoggerExtensions.cs
@@ -0,0 +1,69 @@
+using System;
+
+namespace MQTTnet.Diagnostics.Logger
+{
+ public static class MqttNetSourceLoggerExtensions
+ {
+ public static MqttNetSourceLogger WithSource(this IMqttNetLogger logger, string source)
+ {
+ if (logger == null) throw new ArgumentNullException(nameof(logger));
+
+ return new MqttNetSourceLogger(logger, source);
+ }
+
+ public static void Verbose(this MqttNetSourceLogger logger, string message, params object[] parameters)
+ {
+ logger.Publish(MqttNetLogLevel.Verbose, message, parameters, null);
+ }
+
+ public static void Verbose(this MqttNetSourceLogger logger, string message)
+ {
+ logger.Publish(MqttNetLogLevel.Verbose, message, null, null);
+ }
+
+ public static void Info(this MqttNetSourceLogger logger, string message, params object[] parameters)
+ {
+ logger.Publish(MqttNetLogLevel.Info, message, parameters, null);
+ }
+
+ public static void Info(this MqttNetSourceLogger logger, string message)
+ {
+ logger.Publish(MqttNetLogLevel.Info, message, null, null);
+ }
+
+ public static void Warning(this MqttNetSourceLogger logger, Exception exception, string message, params object[] parameters)
+ {
+ logger.Publish(MqttNetLogLevel.Warning, message, parameters, exception);
+ }
+
+ public static void Warning(this MqttNetSourceLogger logger, Exception exception, string message)
+ {
+ logger.Publish(MqttNetLogLevel.Warning, message, null, exception);
+ }
+
+ public static void Warning(this MqttNetSourceLogger logger, string message, params object[] parameters)
+ {
+ logger.Publish(MqttNetLogLevel.Warning, message, parameters, null);
+ }
+
+ public static void Warning(this MqttNetSourceLogger logger, string message)
+ {
+ logger.Publish(MqttNetLogLevel.Warning, message, null, null);
+ }
+
+ public static void Error(this MqttNetSourceLogger logger, Exception exception, string message, params object[] parameters)
+ {
+ logger.Publish(MqttNetLogLevel.Error, message, parameters, exception);
+ }
+
+ public static void Error(this MqttNetSourceLogger logger, Exception exception, string message)
+ {
+ logger.Publish(MqttNetLogLevel.Error, message, null, exception);
+ }
+
+ public static void Error(this MqttNetSourceLogger logger, string message)
+ {
+ logger.Publish(MqttNetLogLevel.Error, message, null, null);
+ }
+ }
+}
diff --git a/Source/MQTTnet/Diagnostics/MqttNetGlobalLogger.cs b/Source/MQTTnet/Diagnostics/MqttNetGlobalLogger.cs
deleted file mode 100644
index 0ad74863..00000000
--- a/Source/MQTTnet/Diagnostics/MqttNetGlobalLogger.cs
+++ /dev/null
@@ -1,17 +0,0 @@
-using System;
-
-namespace MQTTnet.Diagnostics
-{
- [Obsolete("Please pass an instance of the IMqttNetLogger to the factory/server or client. The global logger will be deleted in the future.")]
- public static class MqttNetGlobalLogger
- {
- public static event EventHandler LogMessagePublished;
-
- public static bool HasListeners => LogMessagePublished != null;
-
- public static void Publish(MqttNetLogMessage logMessage)
- {
- LogMessagePublished?.Invoke(null, new MqttNetLogMessagePublishedEventArgs(logMessage));
- }
- }
-}
diff --git a/Source/MQTTnet/Diagnostics/MqttNetLogger.cs b/Source/MQTTnet/Diagnostics/MqttNetLogger.cs
deleted file mode 100644
index 200ab88f..00000000
--- a/Source/MQTTnet/Diagnostics/MqttNetLogger.cs
+++ /dev/null
@@ -1,73 +0,0 @@
-using System;
-
-namespace MQTTnet.Diagnostics
-{
- public class MqttNetLogger : IMqttNetLogger
- {
- readonly string _logId;
-
- public MqttNetLogger()
- {
- }
-
- public MqttNetLogger(string logId)
- {
- _logId = logId;
- }
-
- public event EventHandler LogMessagePublished;
-
- // TODO: Consider creating a LoggerFactory which will allow creating loggers. The logger factory will
- // be the only place which has the published event.
- public IMqttNetScopedLogger CreateScopedLogger(string source)
- {
- if (source is null) throw new ArgumentNullException(nameof(source));
-
- return new MqttNetScopedLogger(this, source);
- }
-
- public void Publish(MqttNetLogLevel level, string source, string message, object[] parameters, Exception exception)
- {
- var hasLocalListeners = LogMessagePublished != null;
- var hasGlobalListeners = MqttNetGlobalLogger.HasListeners;
-
- if (!hasLocalListeners && !hasGlobalListeners)
- {
- return;
- }
-
- if (parameters?.Length > 0 && message?.Length > 0)
- {
- try
- {
- message = string.Format(message, parameters);
- }
- catch (FormatException)
- {
- message = "MESSAGE FORMAT INVALID: " + message;
- }
- }
-
- var logMessage = new MqttNetLogMessage
- {
- LogId = _logId,
- Timestamp = DateTime.UtcNow,
- Source = source,
- ThreadId = Environment.CurrentManagedThreadId,
- Level = level,
- Message = message,
- Exception = exception
- };
-
- if (hasGlobalListeners)
- {
- MqttNetGlobalLogger.Publish(logMessage);
- }
-
- if (hasLocalListeners)
- {
- LogMessagePublished?.Invoke(this, new MqttNetLogMessagePublishedEventArgs(logMessage));
- }
- }
- }
-}
\ No newline at end of file
diff --git a/Source/MQTTnet/Diagnostics/MqttNetScopedLoggerExtensions.cs b/Source/MQTTnet/Diagnostics/MqttNetScopedLoggerExtensions.cs
deleted file mode 100644
index 961e5cd1..00000000
--- a/Source/MQTTnet/Diagnostics/MqttNetScopedLoggerExtensions.cs
+++ /dev/null
@@ -1,62 +0,0 @@
-using System;
-
-namespace MQTTnet.Diagnostics
-{
- public static class MqttNetScopedLoggerExtensions
- {
- public static void Verbose(this IMqttNetScopedLogger logger, string message, params object[] parameters)
- {
- logger.Publish(MqttNetLogLevel.Verbose, message, parameters, null);
- }
-
- public static void Verbose(this IMqttNetScopedLogger logger, string message)
- {
- logger.Publish(MqttNetLogLevel.Verbose, message, null, null);
- }
-
- public static void Info(this IMqttNetScopedLogger logger, string message, params object[] parameters)
- {
- logger.Publish(MqttNetLogLevel.Info, message, parameters, null);
- }
-
- public static void Info(this IMqttNetScopedLogger logger, string message)
- {
- logger.Publish(MqttNetLogLevel.Info, message, null, null);
- }
-
- public static void Warning(this IMqttNetScopedLogger logger, Exception exception, string message, params object[] parameters)
- {
- logger.Publish(MqttNetLogLevel.Warning, message, parameters, exception);
- }
-
- public static void Warning(this IMqttNetScopedLogger logger, Exception exception, string message)
- {
- logger.Publish(MqttNetLogLevel.Warning, message, null, exception);
- }
-
- public static void Warning(this IMqttNetScopedLogger logger, string message, params object[] parameters)
- {
- logger.Publish(MqttNetLogLevel.Warning, message, parameters, null);
- }
-
- public static void Warning(this IMqttNetScopedLogger logger, string message)
- {
- logger.Publish(MqttNetLogLevel.Warning, message, null, null);
- }
-
- public static void Error(this IMqttNetScopedLogger logger, Exception exception, string message, params object[] parameters)
- {
- logger.Publish(MqttNetLogLevel.Error, message, parameters, exception);
- }
-
- public static void Error(this IMqttNetScopedLogger logger, Exception exception, string message)
- {
- logger.Publish(MqttNetLogLevel.Error, message, null, exception);
- }
-
- public static void Error(this IMqttNetScopedLogger logger, string message)
- {
- logger.Publish(MqttNetLogLevel.Error, message, null, null);
- }
- }
-}
diff --git a/Source/MQTTnet/Diagnostics/TargetFrameworkProvider.cs b/Source/MQTTnet/Diagnostics/Runtime/TargetFrameworkProvider.cs
similarity index 94%
rename from Source/MQTTnet/Diagnostics/TargetFrameworkProvider.cs
rename to Source/MQTTnet/Diagnostics/Runtime/TargetFrameworkProvider.cs
index a5e181dd..abe86311 100644
--- a/Source/MQTTnet/Diagnostics/TargetFrameworkProvider.cs
+++ b/Source/MQTTnet/Diagnostics/Runtime/TargetFrameworkProvider.cs
@@ -1,4 +1,4 @@
-namespace MQTTnet.Diagnostics
+namespace MQTTnet.Diagnostics.Runtime
{
public static class TargetFrameworkProvider
{
diff --git a/Source/MQTTnet/IMqttFactory.cs b/Source/MQTTnet/IMqttFactory.cs
index 8c0e5af3..1c65f5c5 100644
--- a/Source/MQTTnet/IMqttFactory.cs
+++ b/Source/MQTTnet/IMqttFactory.cs
@@ -1,6 +1,7 @@
using System.Collections.Generic;
using MQTTnet.Client;
using MQTTnet.Diagnostics;
+using MQTTnet.Diagnostics.Logger;
using MQTTnet.Server;
namespace MQTTnet
diff --git a/Source/MQTTnet/Implementations/MqttClientAdapterFactory.cs b/Source/MQTTnet/Implementations/MqttClientAdapterFactory.cs
index 920f9822..3d3d8ed2 100644
--- a/Source/MQTTnet/Implementations/MqttClientAdapterFactory.cs
+++ b/Source/MQTTnet/Implementations/MqttClientAdapterFactory.cs
@@ -4,6 +4,7 @@ using MQTTnet.Diagnostics;
using MQTTnet.Formatter;
using System;
using MQTTnet.Channel;
+using MQTTnet.Diagnostics.Logger;
namespace MQTTnet.Implementations
{
diff --git a/Source/MQTTnet/Implementations/MqttTcpServerAdapter.cs b/Source/MQTTnet/Implementations/MqttTcpServerAdapter.cs
index 1900ff47..e3d495f9 100644
--- a/Source/MQTTnet/Implementations/MqttTcpServerAdapter.cs
+++ b/Source/MQTTnet/Implementations/MqttTcpServerAdapter.cs
@@ -9,13 +9,14 @@ using System.Net.Sockets;
using System.Security.Cryptography.X509Certificates;
using System.Threading;
using System.Threading.Tasks;
+using MQTTnet.Diagnostics.Logger;
namespace MQTTnet.Implementations
{
public sealed class MqttTcpServerAdapter : IMqttServerAdapter
{
readonly List _listeners = new List();
- readonly IMqttNetScopedLogger _logger;
+ readonly MqttNetSourceLogger _logger;
readonly IMqttNetLogger _rootLogger;
CancellationTokenSource _cancellationTokenSource;
@@ -23,7 +24,7 @@ namespace MQTTnet.Implementations
public MqttTcpServerAdapter(IMqttNetLogger logger)
{
_rootLogger = logger ?? throw new ArgumentNullException(nameof(logger));
- _logger = logger.CreateScopedLogger(nameof(MqttTcpServerAdapter));
+ _logger = logger.WithSource(nameof(MqttTcpServerAdapter));
}
public Func ClientHandler { get; set; }
diff --git a/Source/MQTTnet/Implementations/MqttTcpServerListener.cs b/Source/MQTTnet/Implementations/MqttTcpServerListener.cs
index 8f164fb5..8d5ac31d 100644
--- a/Source/MQTTnet/Implementations/MqttTcpServerListener.cs
+++ b/Source/MQTTnet/Implementations/MqttTcpServerListener.cs
@@ -12,12 +12,13 @@ using System.Net.Sockets;
using System.Security.Cryptography.X509Certificates;
using System.Threading;
using System.Threading.Tasks;
+using MQTTnet.Diagnostics.Logger;
namespace MQTTnet.Implementations
{
public sealed class MqttTcpServerListener : IDisposable
{
- readonly IMqttNetScopedLogger _logger;
+ readonly MqttNetSourceLogger _logger;
readonly IMqttNetLogger _rootLogger;
readonly AddressFamily _addressFamily;
readonly MqttServerTcpEndpointBaseOptions _options;
@@ -37,7 +38,7 @@ namespace MQTTnet.Implementations
_options = options;
_tlsCertificate = tlsCertificate;
_rootLogger = logger;
- _logger = logger.CreateScopedLogger(nameof(MqttTcpServerListener));
+ _logger = logger.WithSource(nameof(MqttTcpServerListener));
if (_options is MqttServerTlsTcpEndpointOptions tlsOptions)
{
diff --git a/Source/MQTTnet/Internal/TaskExtensions.cs b/Source/MQTTnet/Internal/TaskExtensions.cs
index e7894702..b10c3f56 100644
--- a/Source/MQTTnet/Internal/TaskExtensions.cs
+++ b/Source/MQTTnet/Internal/TaskExtensions.cs
@@ -1,11 +1,12 @@
using MQTTnet.Diagnostics;
using System.Threading.Tasks;
+using MQTTnet.Diagnostics.Logger;
namespace MQTTnet.Internal
{
public static class TaskExtensions
{
- public static void RunInBackground(this Task task, IMqttNetScopedLogger logger = null)
+ public static void RunInBackground(this Task task, MqttNetSourceLogger logger = null)
{
task?.ContinueWith(t =>
{
diff --git a/Source/MQTTnet/LowLevelClient/LowLevelMqttClient.cs b/Source/MQTTnet/LowLevelClient/LowLevelMqttClient.cs
index 56a86428..2fa0e7ce 100644
--- a/Source/MQTTnet/LowLevelClient/LowLevelMqttClient.cs
+++ b/Source/MQTTnet/LowLevelClient/LowLevelMqttClient.cs
@@ -5,12 +5,13 @@ using MQTTnet.Packets;
using System;
using System.Threading;
using System.Threading.Tasks;
+using MQTTnet.Diagnostics.Logger;
namespace MQTTnet.LowLevelClient
{
public sealed class LowLevelMqttClient : ILowLevelMqttClient
{
- readonly IMqttNetScopedLogger _logger;
+ readonly MqttNetSourceLogger _logger;
readonly IMqttClientAdapterFactory _clientAdapterFactory;
IMqttChannelAdapter _adapter;
@@ -21,7 +22,7 @@ namespace MQTTnet.LowLevelClient
_clientAdapterFactory = clientAdapterFactory ?? throw new ArgumentNullException(nameof(clientAdapterFactory));
if (logger is null) throw new ArgumentNullException(nameof(logger));
- _logger = logger.CreateScopedLogger(nameof(LowLevelMqttClient));
+ _logger = logger.WithSource(nameof(LowLevelMqttClient));
}
bool IsConnected => _adapter != null;
diff --git a/Source/MQTTnet/MqttFactory.cs b/Source/MQTTnet/MqttFactory.cs
index cde9b0fd..6a036598 100644
--- a/Source/MQTTnet/MqttFactory.cs
+++ b/Source/MQTTnet/MqttFactory.cs
@@ -1,6 +1,5 @@
using MQTTnet.Adapter;
using MQTTnet.Client;
-using MQTTnet.Diagnostics;
using MQTTnet.Implementations;
using MQTTnet.LowLevelClient;
using MQTTnet.Server;
@@ -10,6 +9,7 @@ using System.Linq;
using MQTTnet.Client.Options;
using MQTTnet.Client.Subscribing;
using MQTTnet.Client.Unsubscribing;
+using MQTTnet.Diagnostics.Logger;
namespace MQTTnet
{
@@ -17,7 +17,7 @@ namespace MQTTnet
{
IMqttClientAdapterFactory _clientAdapterFactory;
- public MqttFactory() : this(new MqttNetLogger())
+ public MqttFactory() : this(new MqttNetNullLogger())
{
}
diff --git a/Source/MQTTnet/Server/IMqttRetainedMessagesManager.cs b/Source/MQTTnet/Server/IMqttRetainedMessagesManager.cs
index 0acc78af..4b85a7e1 100644
--- a/Source/MQTTnet/Server/IMqttRetainedMessagesManager.cs
+++ b/Source/MQTTnet/Server/IMqttRetainedMessagesManager.cs
@@ -1,6 +1,7 @@
using MQTTnet.Diagnostics;
using System.Collections.Generic;
using System.Threading.Tasks;
+using MQTTnet.Diagnostics.Logger;
namespace MQTTnet.Server
{
diff --git a/Source/MQTTnet/Server/IMqttServerFactory.cs b/Source/MQTTnet/Server/IMqttServerFactory.cs
index 39efaa3d..a612c861 100644
--- a/Source/MQTTnet/Server/IMqttServerFactory.cs
+++ b/Source/MQTTnet/Server/IMqttServerFactory.cs
@@ -2,6 +2,7 @@
using System.Collections.Generic;
using MQTTnet.Adapter;
using MQTTnet.Diagnostics;
+using MQTTnet.Diagnostics.Logger;
namespace MQTTnet.Server
{
diff --git a/Source/MQTTnet/Server/Internal/MqttClientConnection.cs b/Source/MQTTnet/Server/Internal/MqttClientConnection.cs
index 4cb0c533..9143c5c3 100644
--- a/Source/MQTTnet/Server/Internal/MqttClientConnection.cs
+++ b/Source/MQTTnet/Server/Internal/MqttClientConnection.cs
@@ -6,6 +6,7 @@ using MQTTnet.Adapter;
using MQTTnet.Client;
using MQTTnet.Client.Disconnecting;
using MQTTnet.Diagnostics;
+using MQTTnet.Diagnostics.Logger;
using MQTTnet.Exceptions;
using MQTTnet.Formatter;
using MQTTnet.Implementations;
@@ -26,7 +27,7 @@ namespace MQTTnet.Server.Internal
readonly MqttClientSessionsManager _sessionsManager;
readonly IMqttChannelAdapter _channelAdapter;
- readonly IMqttNetScopedLogger _logger;
+ readonly MqttNetSourceLogger _logger;
readonly IMqttServerOptions _serverOptions;
readonly string _endpoint;
@@ -52,7 +53,7 @@ namespace MQTTnet.Server.Internal
_connectPacket = connectPacket ?? throw new ArgumentNullException(nameof(connectPacket));
if (logger == null) throw new ArgumentNullException(nameof(logger));
- _logger = logger.CreateScopedLogger(nameof(MqttClientConnection));
+ _logger = logger.WithSource(nameof(MqttClientConnection));
}
public string ClientId => _connectPacket.ClientId;
diff --git a/Source/MQTTnet/Server/Internal/MqttClientSessionsManager.cs b/Source/MQTTnet/Server/Internal/MqttClientSessionsManager.cs
index a6c3591a..33627e9b 100644
--- a/Source/MQTTnet/Server/Internal/MqttClientSessionsManager.cs
+++ b/Source/MQTTnet/Server/Internal/MqttClientSessionsManager.cs
@@ -7,6 +7,7 @@ using System.Threading.Tasks;
using MQTTnet.Adapter;
using MQTTnet.Client.Disconnecting;
using MQTTnet.Diagnostics;
+using MQTTnet.Diagnostics.Logger;
using MQTTnet.Exceptions;
using MQTTnet.Formatter;
using MQTTnet.Internal;
@@ -30,7 +31,7 @@ namespace MQTTnet.Server.Internal
readonly IMqttRetainedMessagesManager _retainedMessagesManager;
readonly IMqttServerOptions _options;
- readonly IMqttNetScopedLogger _logger;
+ readonly MqttNetSourceLogger _logger;
readonly IMqttNetLogger _rootLogger;
public MqttClientSessionsManager(
@@ -40,7 +41,7 @@ namespace MQTTnet.Server.Internal
IMqttNetLogger logger)
{
if (logger == null) throw new ArgumentNullException(nameof(logger));
- _logger = logger.CreateScopedLogger(nameof(MqttClientSessionsManager));
+ _logger = logger.WithSource(nameof(MqttClientSessionsManager));
_rootLogger = logger;
_eventDispatcher = eventDispatcher ?? throw new ArgumentNullException(nameof(eventDispatcher));
@@ -448,7 +449,10 @@ namespace MQTTnet.Server.Internal
return context;
}
- async Task CreateClientConnection(MqttConnectPacket connectPacket, IMqttChannelAdapter channelAdapter, IDictionary