MqttNetLogger.cs 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. using System;
  2. namespace MQTTnet.Diagnostics
  3. {
  4. public class MqttNetLogger : IMqttNetLogger
  5. {
  6. readonly string _logId;
  7. readonly string _source;
  8. readonly MqttNetLogger _parentLogger;
  9. public MqttNetLogger(string source, string logId)
  10. {
  11. _source = source;
  12. _logId = logId;
  13. }
  14. public MqttNetLogger()
  15. {
  16. }
  17. public MqttNetLogger(string logId)
  18. {
  19. _logId = logId;
  20. }
  21. MqttNetLogger(MqttNetLogger parentLogger, string logId, string source)
  22. {
  23. _parentLogger = parentLogger ?? throw new ArgumentNullException(nameof(parentLogger));
  24. _source = source ?? throw new ArgumentNullException(nameof(source));
  25. _logId = logId;
  26. }
  27. public event EventHandler<MqttNetLogMessagePublishedEventArgs> LogMessagePublished;
  28. // TODO: Consider creating a LoggerFactory which will allow creating loggers. The logger factory will
  29. // be the only place which has the published event.
  30. public IMqttNetLogger CreateChildLogger(string source)
  31. {
  32. if (source is null) throw new ArgumentNullException(nameof(source));
  33. return new MqttNetLogger(this, _logId, source);
  34. }
  35. public void Publish(MqttNetLogLevel level, string message, object[] parameters, Exception exception)
  36. {
  37. var hasLocalListeners = LogMessagePublished != null;
  38. var hasGlobalListeners = MqttNetGlobalLogger.HasListeners;
  39. if (!hasLocalListeners && !hasGlobalListeners && _parentLogger == null)
  40. {
  41. return;
  42. }
  43. if (parameters?.Length > 0)
  44. {
  45. try
  46. {
  47. message = string.Format(message, parameters);
  48. }
  49. catch
  50. {
  51. message = "MESSAGE FORMAT INVALID: " + message;
  52. }
  53. }
  54. var logMessage = new MqttNetLogMessage
  55. {
  56. LogId = _logId,
  57. Timestamp = DateTime.UtcNow,
  58. Source = _source,
  59. ThreadId = Environment.CurrentManagedThreadId,
  60. Level = level,
  61. Message = message,
  62. Exception = exception
  63. };
  64. if (hasGlobalListeners)
  65. {
  66. MqttNetGlobalLogger.Publish(logMessage);
  67. }
  68. if (hasLocalListeners)
  69. {
  70. LogMessagePublished?.Invoke(this, new MqttNetLogMessagePublishedEventArgs(logMessage));
  71. }
  72. _parentLogger?.Publish(logMessage);
  73. }
  74. void Publish(MqttNetLogMessage logMessage)
  75. {
  76. LogMessagePublished?.Invoke(this, new MqttNetLogMessagePublishedEventArgs(logMessage));
  77. _parentLogger?.Publish(logMessage);
  78. }
  79. }
  80. }