mirror of
https://github.com/dotnet/MQTTnet.git
synced 2026-10-15 00:15:15 +08:00
Refactor logger. (#1247)
This commit is contained in:
@@ -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<IMqttNetLogger>(logger);
|
||||
services.AddSingleton<MqttHostedServer>();
|
||||
|
||||
@@ -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<IMqttServerAdapter> adapters, IMqttNetLogger logger)
|
||||
: base(adapters, logger)
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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<string> _unsubscriptions = new HashSet<string>();
|
||||
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;
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
using MQTTnet.Diagnostics;
|
||||
using System;
|
||||
using System;
|
||||
using MQTTnet.Diagnostics.Logger;
|
||||
|
||||
namespace MQTTnet.Extensions.ManagedClient
|
||||
{
|
||||
|
||||
@@ -4,6 +4,7 @@ using MQTTnet.Diagnostics;
|
||||
using MQTTnet.Formatter;
|
||||
using MQTTnet.Implementations;
|
||||
using System;
|
||||
using MQTTnet.Diagnostics.Logger;
|
||||
|
||||
namespace MQTTnet.Extensions.WebSocket4Net
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
using MQTTnet.Adapter;
|
||||
using MQTTnet.Diagnostics;
|
||||
using MQTTnet.Diagnostics.Logger;
|
||||
using MQTTnet.LowLevelClient;
|
||||
|
||||
namespace MQTTnet.Client
|
||||
|
||||
@@ -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; }
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
+1
-3
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,58 @@
|
||||
using System;
|
||||
|
||||
namespace MQTTnet.Diagnostics.Logger
|
||||
{
|
||||
/// <summary>
|
||||
/// This logger fires an event when a new message was published.
|
||||
/// </summary>
|
||||
public sealed class MqttNetEventLogger : IMqttNetLogger
|
||||
{
|
||||
public MqttNetEventLogger(string logId = null)
|
||||
{
|
||||
LogId = logId;
|
||||
}
|
||||
|
||||
public event EventHandler<MqttNetLogMessagePublishedEventArgs> 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));
|
||||
}
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
namespace MQTTnet.Diagnostics
|
||||
namespace MQTTnet.Diagnostics.Logger
|
||||
{
|
||||
public enum MqttNetLogLevel
|
||||
{
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
using System;
|
||||
|
||||
namespace MQTTnet.Diagnostics
|
||||
namespace MQTTnet.Diagnostics.Logger
|
||||
{
|
||||
public sealed class MqttNetLogMessage
|
||||
{
|
||||
+1
-8
@@ -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; }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
using System;
|
||||
|
||||
namespace MQTTnet.Diagnostics.Logger
|
||||
{
|
||||
/// <summary>
|
||||
/// This logger does nothing with the messages.
|
||||
/// </summary>
|
||||
public sealed class MqttNetNullLogger : IMqttNetLogger
|
||||
{
|
||||
public void Publish(MqttNetLogLevel logLevel, string source, string message, object[] parameters, Exception exception)
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
+4
-9
@@ -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)
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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<MqttNetLogMessagePublishedEventArgs> LogMessagePublished;
|
||||
|
||||
public static bool HasListeners => LogMessagePublished != null;
|
||||
|
||||
public static void Publish(MqttNetLogMessage logMessage)
|
||||
{
|
||||
LogMessagePublished?.Invoke(null, new MqttNetLogMessagePublishedEventArgs(logMessage));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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<MqttNetLogMessagePublishedEventArgs> 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));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
namespace MQTTnet.Diagnostics
|
||||
namespace MQTTnet.Diagnostics.Runtime
|
||||
{
|
||||
public static class TargetFrameworkProvider
|
||||
{
|
||||
@@ -1,6 +1,7 @@
|
||||
using System.Collections.Generic;
|
||||
using MQTTnet.Client;
|
||||
using MQTTnet.Diagnostics;
|
||||
using MQTTnet.Diagnostics.Logger;
|
||||
using MQTTnet.Server;
|
||||
|
||||
namespace MQTTnet
|
||||
|
||||
@@ -4,6 +4,7 @@ using MQTTnet.Diagnostics;
|
||||
using MQTTnet.Formatter;
|
||||
using System;
|
||||
using MQTTnet.Channel;
|
||||
using MQTTnet.Diagnostics.Logger;
|
||||
|
||||
namespace MQTTnet.Implementations
|
||||
{
|
||||
|
||||
@@ -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<MqttTcpServerListener> _listeners = new List<MqttTcpServerListener>();
|
||||
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<IMqttChannelAdapter, Task> ClientHandler { get; set; }
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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 =>
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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())
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
using MQTTnet.Diagnostics;
|
||||
using System.Collections.Generic;
|
||||
using System.Threading.Tasks;
|
||||
using MQTTnet.Diagnostics.Logger;
|
||||
|
||||
namespace MQTTnet.Server
|
||||
{
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
using System.Collections.Generic;
|
||||
using MQTTnet.Adapter;
|
||||
using MQTTnet.Diagnostics;
|
||||
using MQTTnet.Diagnostics.Logger;
|
||||
|
||||
namespace MQTTnet.Server
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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<MqttClientConnection> CreateClientConnection(MqttConnectPacket connectPacket, IMqttChannelAdapter channelAdapter, IDictionary<object, object> sessionItems)
|
||||
async Task<MqttClientConnection> CreateClientConnection(
|
||||
MqttConnectPacket connectPacket,
|
||||
IMqttChannelAdapter channelAdapter,
|
||||
IDictionary<object, object> sessionItems)
|
||||
{
|
||||
MqttClientConnection connection;
|
||||
|
||||
@@ -500,7 +504,9 @@ namespace MQTTnet.Server.Internal
|
||||
return connection;
|
||||
}
|
||||
|
||||
async Task<MqttApplicationMessageInterceptorContext> InterceptApplicationMessageAsync(IMqttServerApplicationMessageInterceptor interceptor, MqttClientConnection clientConnection,
|
||||
async Task<MqttApplicationMessageInterceptorContext> InterceptApplicationMessageAsync(
|
||||
IMqttServerApplicationMessageInterceptor interceptor,
|
||||
MqttClientConnection clientConnection,
|
||||
MqttApplicationMessage applicationMessage)
|
||||
{
|
||||
string senderClientId;
|
||||
@@ -522,7 +528,6 @@ namespace MQTTnet.Server.Internal
|
||||
{
|
||||
ClientId = senderClientId,
|
||||
SessionItems = sessionItems,
|
||||
Logger = _logger,
|
||||
AcceptPublish = true,
|
||||
ApplicationMessage = applicationMessage,
|
||||
CloseConnection = false
|
||||
|
||||
@@ -4,6 +4,7 @@ using System.Linq;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using MQTTnet.Diagnostics;
|
||||
using MQTTnet.Diagnostics.Logger;
|
||||
using MQTTnet.Implementations;
|
||||
using MQTTnet.Internal;
|
||||
|
||||
@@ -14,14 +15,14 @@ namespace MQTTnet.Server.Internal
|
||||
readonly AsyncLock _storageAccessLock = new AsyncLock();
|
||||
readonly Dictionary<string, MqttApplicationMessage> _messages = new Dictionary<string, MqttApplicationMessage>(4096);
|
||||
|
||||
IMqttNetScopedLogger _logger;
|
||||
MqttNetSourceLogger _logger;
|
||||
IMqttServerOptions _options;
|
||||
|
||||
// TODO: Get rid of the logger here!
|
||||
public Task Start(IMqttServerOptions options, IMqttNetLogger logger)
|
||||
{
|
||||
if (logger == null) throw new ArgumentNullException(nameof(logger));
|
||||
_logger = logger.CreateScopedLogger(nameof(MqttRetainedMessagesManager));
|
||||
_logger = logger.WithSource(nameof(MqttRetainedMessagesManager));
|
||||
|
||||
_options = options ?? throw new ArgumentNullException(nameof(options));
|
||||
return PlatformAbstractionLayer.CompletedTask;
|
||||
|
||||
@@ -3,19 +3,20 @@ using System.Threading.Tasks;
|
||||
using MQTTnet.Adapter;
|
||||
using MQTTnet.Client.Receiving;
|
||||
using MQTTnet.Diagnostics;
|
||||
using MQTTnet.Diagnostics.Logger;
|
||||
using MQTTnet.Packets;
|
||||
|
||||
namespace MQTTnet.Server.Internal
|
||||
{
|
||||
public sealed class MqttServerEventDispatcher
|
||||
{
|
||||
readonly IMqttNetScopedLogger _logger;
|
||||
readonly MqttNetSourceLogger _logger;
|
||||
|
||||
public MqttServerEventDispatcher(IMqttNetLogger logger)
|
||||
{
|
||||
if (logger is null) throw new ArgumentNullException(nameof(logger));
|
||||
|
||||
_logger = logger.CreateScopedLogger(nameof(MqttServerEventDispatcher));
|
||||
_logger = logger.WithSource(nameof(MqttServerEventDispatcher));
|
||||
}
|
||||
|
||||
public IMqttServerClientConnectedHandler ClientConnectedHandler { get; set; }
|
||||
|
||||
@@ -3,6 +3,7 @@ using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using MQTTnet.Client.Disconnecting;
|
||||
using MQTTnet.Diagnostics;
|
||||
using MQTTnet.Diagnostics.Logger;
|
||||
using MQTTnet.Implementations;
|
||||
using MQTTnet.Internal;
|
||||
|
||||
@@ -12,7 +13,7 @@ namespace MQTTnet.Server.Internal
|
||||
{
|
||||
readonly IMqttServerOptions _options;
|
||||
readonly MqttClientSessionsManager _sessionsManager;
|
||||
readonly IMqttNetScopedLogger _logger;
|
||||
readonly MqttNetSourceLogger _logger;
|
||||
|
||||
public MqttServerKeepAliveMonitor(IMqttServerOptions options, MqttClientSessionsManager sessionsManager, IMqttNetLogger logger)
|
||||
{
|
||||
@@ -20,7 +21,7 @@ namespace MQTTnet.Server.Internal
|
||||
_sessionsManager = sessionsManager ?? throw new ArgumentNullException(nameof(sessionsManager));
|
||||
|
||||
if (logger == null) throw new ArgumentNullException(nameof(logger));
|
||||
_logger = logger.CreateScopedLogger(nameof(MqttServerKeepAliveMonitor));
|
||||
_logger = logger.WithSource(nameof(MqttServerKeepAliveMonitor));
|
||||
}
|
||||
|
||||
public void Start(CancellationToken cancellationToken)
|
||||
|
||||
@@ -1,15 +1,9 @@
|
||||
using System.Collections.Generic;
|
||||
using MQTTnet.Diagnostics;
|
||||
|
||||
namespace MQTTnet.Server
|
||||
{
|
||||
public sealed class MqttApplicationMessageInterceptorContext
|
||||
{
|
||||
/// <summary>
|
||||
/// Gets the currently used logger.
|
||||
/// </summary>
|
||||
public IMqttNetScopedLogger Logger { get; internal set; }
|
||||
|
||||
{
|
||||
/// <summary>
|
||||
/// Gets the client identifier.
|
||||
/// Hint: This identifier needs to be unique over all used clients / devices on the broker to avoid connection issues.
|
||||
|
||||
@@ -10,6 +10,7 @@ using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using MQTTnet.Diagnostics.Logger;
|
||||
using MQTTnet.Implementations;
|
||||
using MQTTnet.Internal;
|
||||
using MQTTnet.Server.Internal;
|
||||
@@ -21,7 +22,7 @@ namespace MQTTnet.Server
|
||||
readonly MqttServerEventDispatcher _eventDispatcher;
|
||||
readonly ICollection<IMqttServerAdapter> _adapters;
|
||||
readonly IMqttNetLogger _rootLogger;
|
||||
readonly IMqttNetScopedLogger _logger;
|
||||
readonly MqttNetSourceLogger _logger;
|
||||
|
||||
MqttClientSessionsManager _clientSessionsManager;
|
||||
IMqttRetainedMessagesManager _retainedMessagesManager;
|
||||
@@ -34,7 +35,7 @@ namespace MQTTnet.Server
|
||||
_adapters = adapters.ToList();
|
||||
|
||||
if (logger == null) throw new ArgumentNullException(nameof(logger));
|
||||
_logger = logger.CreateScopedLogger(nameof(MqttServer));
|
||||
_logger = logger.WithSource(nameof(MqttServer));
|
||||
_rootLogger = logger;
|
||||
|
||||
_eventDispatcher = new MqttServerEventDispatcher(logger);
|
||||
|
||||
+7
-2
@@ -1,6 +1,5 @@
|
||||
using System;
|
||||
using System.Threading.Tasks;
|
||||
using MQTTnet.Diagnostics;
|
||||
using MQTTnet.Implementations;
|
||||
using MQTTnet.Internal;
|
||||
|
||||
@@ -21,6 +20,8 @@ namespace MQTTnet.Server
|
||||
};
|
||||
}
|
||||
|
||||
public Func<MqttApplicationMessageInterceptorContext, Exception, Task> ExceptionHandler { get; set; }
|
||||
|
||||
public MqttServerMultiThreadedApplicationMessageInterceptorDelegate(Func<MqttApplicationMessageInterceptorContext, Task> callback)
|
||||
{
|
||||
_callback = callback ?? throw new ArgumentNullException(nameof(callback));
|
||||
@@ -36,7 +37,11 @@ namespace MQTTnet.Server
|
||||
}
|
||||
catch (Exception exception)
|
||||
{
|
||||
context.Logger.Error(exception, "Error while intercepting application message.");
|
||||
var exceptionHandler = ExceptionHandler;
|
||||
if (exceptionHandler != null)
|
||||
{
|
||||
await exceptionHandler.Invoke(context, exception).ConfigureAwait(false);
|
||||
}
|
||||
}
|
||||
}).RunInBackground();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user