AMQNET-614: Extend logging
diff --git a/src/NMS.AMQP/NmsConnection.cs b/src/NMS.AMQP/NmsConnection.cs
index f8bf283..a34d343 100644
--- a/src/NMS.AMQP/NmsConnection.cs
+++ b/src/NMS.AMQP/NmsConnection.cs
@@ -314,10 +314,14 @@
             {
                 session.OnInboundMessage(envelope);
             }
+            else
+            {
+                Tracer.Error($"Could not dispatch message {envelope.Message.NMSMessageId} because session {envelope.ConsumerInfo.SessionId} not found.");
+            }
 
             if (connectionListeners.Any())
             {
-                foreach (INmsConnectionListener listener in connectionListeners) 
+                foreach (INmsConnectionListener listener in connectionListeners)
                     listener.OnInboundMessage(envelope.Message);
             }
         }
diff --git a/src/NMS.AMQP/NmsMessageConsumer.cs b/src/NMS.AMQP/NmsMessageConsumer.cs
index a8c65d5..2475255 100644
--- a/src/NMS.AMQP/NmsMessageConsumer.cs
+++ b/src/NMS.AMQP/NmsMessageConsumer.cs
@@ -200,6 +200,11 @@
 
         public void OnInboundMessage(InboundMessageDispatch envelope)
         {
+            if (Tracer.IsDebugEnabled)
+            {
+                Tracer.Debug($"Message {envelope.Message.NMSMessageId} passed to consumer {Info.Id}");
+            }
+
             SetAcknowledgeCallback(envelope);
 
             if (envelope.EnqueueFirst)
@@ -215,6 +220,11 @@
 
         private void DeliverNextPending()
         {
+            if (Tracer.IsDebugEnabled)
+            {
+                Tracer.Debug($"{Info.Id} is about to deliver next pending message.");
+            }
+            
             if (Session.IsStarted && started && Listener != null)
             {
                 lock (SyncRoot)
@@ -225,19 +235,30 @@
                         {
                             var envelope = messageQueue.DequeueNoWait();
                             if (envelope == null)
+                            {
+                                if (Tracer.IsDebugEnabled)
+                                {
+                                    Tracer.Debug($"No message available for delivery.");
+                                }
+
                                 return;
+                            }
 
                             if (IsMessageExpired(envelope))
                             {
                                 if (Tracer.IsDebugEnabled)
+                                {
                                     Tracer.Debug($"{Info.Id} filtered expired message: {envelope.Message.NMSMessageId}");
+                                }
 
                                 DoAckExpired(envelope);
                             }
                             else if (IsRedeliveryExceeded(envelope))
                             {
                                 if (Tracer.IsDebugEnabled)
-                                    Tracer.Debug($"{Info.Id} filtered message with excessive redelivery count: {envelope.RedeliveryCount}");
+                                {
+                                    Tracer.Debug($"{Info.Id} filtered message with excessive redelivery count: {envelope.RedeliveryCount.ToString()}");
+                                }
 
                                 // TODO: Apply redelivery policy
                                 DoAckExpired(envelope);
@@ -320,6 +341,11 @@
 
                 while (true)
                 {
+                    if (Tracer.IsDebugEnabled)
+                    {
+                        Tracer.Debug("Trying to dequeue next message.");
+                    }
+
                     InboundMessageDispatch envelope = messageQueue.Dequeue(timeout);
 
                     if (failureCause != null)
@@ -331,7 +357,9 @@
                     if (IsMessageExpired(envelope))
                     {
                         if (Tracer.IsDebugEnabled)
+                        {
                             Tracer.Debug($"{Info.Id} filtered expired message: {envelope.Message.NMSMessageId}");
+                        }
 
                         DoAckExpired(envelope);
 
@@ -341,7 +369,9 @@
                     else if (IsRedeliveryExceeded(envelope))
                     {
                         if (Tracer.IsDebugEnabled)
-                            Tracer.Debug($"{Info.Id} filtered message with excessive redelivery count: {envelope.RedeliveryCount}");
+                        {
+                            Tracer.Debug($"{Info.Id} filtered message with excessive redelivery count: {envelope.RedeliveryCount.ToString()}");
+                        }
 
                         // TODO: Apply redelivery policy
                         DoAckExpired(envelope);
@@ -349,7 +379,9 @@
                     else
                     {
                         if (Tracer.IsDebugEnabled)
-                            Tracer.Debug($"{Info.Id}  received message {envelope.Message.NMSMessageId}.");
+                        {
+                            Tracer.Debug($"{Info.Id} received message {envelope.Message.NMSMessageId}.");
+                        }
 
                         AckFromReceive(envelope);
                         return envelope.Message.Copy();
@@ -423,11 +455,23 @@
         {
             if (closed.CompareAndSet(false, true))
             {
+                if (Tracer.IsDebugEnabled)
+                {
+                    Tracer.Debug("Shutting down NmsMessageConsumer.");
+                }
+
                 failureCause = exception;
                 Session.Remove(this);
                 started.Set(false);
                 messageQueue.Dispose();
             }
+            else
+            {
+                if (Tracer.IsDebugEnabled)
+                {
+                    Tracer.Debug("NmsMessageConsumer already closed.");
+                }
+            }
         }
 
         public void Start()
diff --git a/src/NMS.AMQP/NmsSession.cs b/src/NMS.AMQP/NmsSession.cs
index 1b1c0f6..9904098 100644
--- a/src/NMS.AMQP/NmsSession.cs
+++ b/src/NMS.AMQP/NmsSession.cs
@@ -344,6 +344,10 @@
             {
                 messageConsumer.OnInboundMessage(envelope);
             }
+            else
+            {
+                Tracer.Error($"Could not dispatch message {envelope.Message.NMSMessageId} because consumer {envelope.ConsumerId} not found.");
+            }
         }
 
         public void Acknowledge(AckType ackType)
@@ -422,6 +426,11 @@
 
         internal void EnqueueForDispatch(NmsMessageConsumer.MessageDeliveryTask task)
         {
+            if (Tracer.IsDebugEnabled)
+            {
+                Tracer.Debug("Message enqueued for dispatch.");
+            }
+            
             dispatcher?.Post(task);
         }
 
@@ -451,7 +460,7 @@
 
         public NmsMessageProducer ProducerClosed(Id producerId, Exception cause)
         {
-            Tracer.Info($"A NMS MessageProducer has been closed: {producerId}");
+            Tracer.Info($"A NmsMessageProducer has been closed: {producerId}. Cause: {cause}");
 
             if (producers.TryGetValue(producerId, out NmsMessageProducer producer))
             {
@@ -464,6 +473,14 @@
                     Tracer.DebugFormat("Ignoring exception thrown during cleanup of closed producer", error);
                 }
             }
+            else
+            {
+                if (Tracer.IsDebugEnabled)
+                {
+                    Tracer.Debug($"NmsMessageProducer: {producerId} not found in session {this.SessionInfo.Id}.");
+                }
+
+            }
             
             return producer;
         }
diff --git a/src/NMS.AMQP/Provider/Amqp/AmqpConsumer.cs b/src/NMS.AMQP/Provider/Amqp/AmqpConsumer.cs
index fb4fd37..1481248 100644
--- a/src/NMS.AMQP/Provider/Amqp/AmqpConsumer.cs
+++ b/src/NMS.AMQP/Provider/Amqp/AmqpConsumer.cs
@@ -195,6 +195,11 @@
 
         private void OnMessage(IReceiverLink receiver, global::Amqp.Message amqpMessage)
         {
+            if (Tracer.IsDebugEnabled)
+            {
+                Tracer.Debug($"Received message {amqpMessage?.Properties?.MessageId}");
+            }
+            
             NmsMessage message;
             try
             {
diff --git a/src/NMS.AMQP/Provider/Amqp/AmqpProvider.cs b/src/NMS.AMQP/Provider/Amqp/AmqpProvider.cs
index 24022a8..99330db 100644
--- a/src/NMS.AMQP/Provider/Amqp/AmqpProvider.cs
+++ b/src/NMS.AMQP/Provider/Amqp/AmqpProvider.cs
@@ -41,6 +41,66 @@
             this.transport = transport;
         }
 
+        static AmqpProvider()
+        {
+            // Set up tracing in AMQP. We capture all AMQP traces in the TraceListener below
+            // and map to NMS 'Tracer' logs as follows:
+            //    AMQP          Tracer
+            //    Verbose       Debug
+            //    Frame         Debug
+            //    Information   Info
+            //    Output        Info    (should not happen)
+            //    Warning       Warn
+            //    Error         Error
+            Trace.TraceLevel = TraceLevel.Verbose;
+            Trace.TraceListener = (level, format, args) =>
+            {
+                switch (level)
+                {
+                    case TraceLevel.Verbose:
+                    case TraceLevel.Frame:
+                        Tracer.DebugFormat(format, args);
+                        break;
+                    case TraceLevel.Information:
+                    case TraceLevel.Output:
+                        // 
+                        // Applications should not access AmqpLite directly so there
+                        // should be no 'Output' level logs.
+                        Tracer.InfoFormat(format, args);
+                        break;
+                    case TraceLevel.Warning:
+                        Tracer.WarnFormat(format, args);
+                        break;
+                    case TraceLevel.Error:
+                        Tracer.ErrorFormat(format, args);
+                        break;
+                    default:
+                        Tracer.InfoFormat("Unknown AMQP LogLevel: {}", level);
+                        Tracer.InfoFormat(format, args);
+                        break;
+                }
+            };
+        }
+        
+        /// <summary>
+        /// Enables AmqpNetLite's Frame logging level.
+        /// </summary>
+        public bool TraceFrames
+        {
+            get => ((Trace.TraceLevel & TraceLevel.Frame) == TraceLevel.Frame);
+            set
+            {
+                if (value)
+                {
+                    Trace.TraceLevel = Trace.TraceLevel | TraceLevel.Frame;
+                }
+                else
+                {
+                    Trace.TraceLevel = Trace.TraceLevel & ~TraceLevel.Frame;
+                }
+            }
+        }
+
         public long SendTimeout => connectionInfo?.SendTimeout ?? ConnectionInfo.DEFAULT_SEND_TIMEOUT;
         public Uri RemoteUri { get; }
         public IProviderListener Listener { get; private set; }
@@ -58,6 +118,11 @@
 
         internal void OnConnectionClosed(Error error)
         {
+            if (Tracer.IsDebugEnabled)
+            {
+                Tracer.Debug($"Connection closed. {error}");
+            }
+
             bool connectionExplicitlyClosed = error == null;
             if (!connectionExplicitlyClosed)
             {
diff --git a/src/NMS.AMQP/Transport/ITransportContext.cs b/src/NMS.AMQP/Transport/ITransportContext.cs
index ad225be..a7afefb 100644
--- a/src/NMS.AMQP/Transport/ITransportContext.cs
+++ b/src/NMS.AMQP/Transport/ITransportContext.cs
@@ -31,13 +31,13 @@
         int SendBufferSize { get; set; }
 
         int SendTimeout { get; set; }
+        
         bool TcpNoDelay { get; set; }
-
-        bool UseLogging { get; set; }
+        
         bool IsSecure { get; }
-
+        
         ITransportContext Copy();
-
+        
         Task<Connection> CreateAsync(Address address, IHandler handler);
     }
 }
diff --git a/src/NMS.AMQP/Transport/TransportContext.cs b/src/NMS.AMQP/Transport/TransportContext.cs
index 229d8e7..d5aead9 100644
--- a/src/NMS.AMQP/Transport/TransportContext.cs
+++ b/src/NMS.AMQP/Transport/TransportContext.cs
@@ -43,49 +43,6 @@
             connectionBuilder.SASL.Profile = Amqp.Sasl.SaslProfile.Anonymous;            
         }
 
-        static TransportContext()
-        {
-            //
-            // Set up tracing in AMQP.  We capture all AMQP traces in the TraceListener below
-            // and map to NMS 'Tracer' logs as follows:
-            //    AMQP          Tracer
-            //    Verbose       Debug
-            //    Frame         Debug
-            //    Information   Info
-            //    Output        Info    (should not happen)
-            //    Warning       Warn
-            //    Error         Error
-            //
-            Amqp.Trace.TraceLevel = Amqp.TraceLevel.Verbose | Amqp.TraceLevel.Frame;
-            Amqp.Trace.TraceListener = (level, format, args) =>
-            {
-                switch (level)
-                {
-                    case Amqp.TraceLevel.Verbose:
-                    case Amqp.TraceLevel.Frame:
-                        Tracer.DebugFormat(format, args);
-                        break;
-                    case Amqp.TraceLevel.Information:
-                    case Amqp.TraceLevel.Output:
-                        // 
-                        // Applications should not access AmqpLite directly so there
-                        // should be no 'Output' level logs.
-                        Tracer.InfoFormat(format, args);
-                        break;
-                    case Amqp.TraceLevel.Warning:
-                        Tracer.WarnFormat(format, args);
-                        break;
-                    case Amqp.TraceLevel.Error:
-                        Tracer.ErrorFormat(format, args);
-                        break;
-                    default:
-                        Tracer.InfoFormat("Unknown AMQP LogLevel: {}", level);
-                        Tracer.InfoFormat(format, args);
-                        break;
-                }
-            };
-        }
-
         #region Transport Options
 
         public int ReceiveBufferSize { get => this.connectionBuilder.TCP.ReceiveBufferSize; set => this.connectionBuilder.TCP.ReceiveBufferSize = value; }
@@ -127,25 +84,6 @@
                 }
             }
         }
-
-        /// <summary>
-        /// UseLogging Enables AmqpNetLite's Frame logging level.
-        /// </summary>
-        public bool UseLogging
-        {
-            get => ((Amqp.Trace.TraceLevel & Amqp.TraceLevel.Frame) == Amqp.TraceLevel.Frame);
-            set
-            {
-                if (value)
-                {
-                    Amqp.Trace.TraceLevel = Amqp.Trace.TraceLevel | Amqp.TraceLevel.Frame;
-                }
-                else
-                {
-                    Amqp.Trace.TraceLevel = Amqp.Trace.TraceLevel & ~Amqp.TraceLevel.Frame;
-                }
-            }
-        }
         
         #endregion
 
diff --git a/src/NMS.AMQP/Util/IdGenerator.cs b/src/NMS.AMQP/Util/IdGenerator.cs
index 1c91fbf..f3d1c7a 100644
--- a/src/NMS.AMQP/Util/IdGenerator.cs
+++ b/src/NMS.AMQP/Util/IdGenerator.cs
@@ -125,7 +125,6 @@
 
         public void Add(object component)
         {
-            Tracer.DebugFormat("Adding Component To Id, component {0}, current index: {1}", component, current);
             if (isReadOnly)
             {
                 throw new NMSException("Invalid Operation when generating Component Id. Can not change id once generated.");
diff --git a/test/Apache-NMS-AMQP-Test/Apache-NMS-AMQP-Test.csproj b/test/Apache-NMS-AMQP-Test/Apache-NMS-AMQP-Test.csproj
index a66cc6b..68c6937 100644
--- a/test/Apache-NMS-AMQP-Test/Apache-NMS-AMQP-Test.csproj
+++ b/test/Apache-NMS-AMQP-Test/Apache-NMS-AMQP-Test.csproj
@@ -31,6 +31,7 @@
   <ItemGroup>
     <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.1.1" />
     <PackageReference Include="Moq" Version="4.11.0" />
+    <PackageReference Include="NLog" Version="4.6.7" />
     <PackageReference Include="NUnit" Version="3.12.0" />
     <PackageReference Include="NUnit.Console" Version="3.10.0" />
     <PackageReference Include="NUnit3TestAdapter" Version="3.13.0" />
@@ -44,6 +45,9 @@
     <None Include=".\config\cert\client.crt" Link="client.crt">
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>
     </None>
+    <None Update="NLog.config">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
     <None Update="TestSuite.config">
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>
     </None>
diff --git a/test/Apache-NMS-AMQP-Test/Integration/AmqpAcknowledgmentsIntegrationTest.cs b/test/Apache-NMS-AMQP-Test/Integration/AmqpAcknowledgmentsIntegrationTest.cs
index 09bdc04..ba09d9c 100644
--- a/test/Apache-NMS-AMQP-Test/Integration/AmqpAcknowledgmentsIntegrationTest.cs
+++ b/test/Apache-NMS-AMQP-Test/Integration/AmqpAcknowledgmentsIntegrationTest.cs
@@ -296,7 +296,7 @@
                     testPeer.ExpectDispositionThatIsAcceptedAndSettled();
 
                 for (int i = 0; i < msgCount; i++) 
-                    Assert.NotNull(consumer.Receive(TimeSpan.FromMilliseconds(3000)));
+                    Assert.NotNull(consumer.Receive(TimeSpan.FromMilliseconds(3000)), $"Message {i} not received within given timeout.");
                 
                 testPeer.WaitForAllMatchersToComplete(3000);
                 
diff --git a/test/Apache-NMS-AMQP-Test/Integration/FailoverIntegrationTest.cs b/test/Apache-NMS-AMQP-Test/Integration/FailoverIntegrationTest.cs
index d4eaeb1..816dc84 100644
--- a/test/Apache-NMS-AMQP-Test/Integration/FailoverIntegrationTest.cs
+++ b/test/Apache-NMS-AMQP-Test/Integration/FailoverIntegrationTest.cs
@@ -24,6 +24,7 @@
 using Apache.NMS;
 using Apache.NMS.AMQP;
 using Moq;
+using NLog;
 using NMS.AMQP.Test.TestAmqp;
 using NMS.AMQP.Test.TestAmqp.BasicTypes;
 using NUnit.Framework;
@@ -33,6 +34,8 @@
     [TestFixture]
     public class FailoverIntegrationTest : IntegrationTestFixture
     {
+        private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
+        
         [Test, Timeout(20_000), Ignore("Ignore as we cannot detect connection disconnect on Linux.")]
         public void TestFailoverHandlesDropThenRejectionCloseAfterConnect()
         {
@@ -47,6 +50,10 @@
                 var originalUri = CreatePeerUri(originalPeer);
                 var rejectingUri = CreatePeerUri(rejectingPeer);
                 var finalUri = CreatePeerUri(finalPeer);
+                
+                Logger.Info($"Original peer is at: {originalUri}");
+                Logger.Info($"Rejecting peer is at: {rejectingUri}");
+                Logger.Info($"Final peer is at: {finalUri}");
 
                 // Connect to the first
                 originalPeer.ExpectSaslAnonymous();
@@ -85,7 +92,7 @@
                 finalPeer.ExpectBegin();
 
                 // Close the original peer and wait for things to shake out.
-                originalPeer.Close(sendClose: false);
+                originalPeer.Close(sendClose: true);
 
                 rejectingPeer.WaitForAllMatchersToComplete(2000);
 
diff --git a/test/Apache-NMS-AMQP-Test/Integration/IntegrationTestFixture.cs b/test/Apache-NMS-AMQP-Test/Integration/IntegrationTestFixture.cs
index cd52602..9a13133 100644
--- a/test/Apache-NMS-AMQP-Test/Integration/IntegrationTestFixture.cs
+++ b/test/Apache-NMS-AMQP-Test/Integration/IntegrationTestFixture.cs
@@ -27,7 +27,7 @@
     {
         static IntegrationTestFixture()
         {
-            Tracer.Trace = new Logger(Logger.LogLevel.DEBUG);
+            Tracer.Trace = new NLogAdapter();
         }
         
         protected IConnection EstablishConnection(TestAmqpPeer testPeer, string optionsString = null, Symbol[] serverCapabilities = null, Fields serverProperties = null, bool setClientId = true)
diff --git a/test/Apache-NMS-AMQP-Test/NLog.config b/test/Apache-NMS-AMQP-Test/NLog.config
new file mode 100644
index 0000000..71b7c9c
--- /dev/null
+++ b/test/Apache-NMS-AMQP-Test/NLog.config
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+
+    <targets>
+        <target name="logconsole" xsi:type="Console" layout="${time} | ${level} | ${callsite:includeNamespace=false:methodName=false} | ${message}" />
+    </targets>
+
+    <rules>
+        <logger name="*" minlevel="Debug" writeTo="logconsole" />
+    </rules>
+</nlog>
\ No newline at end of file
diff --git a/test/Apache-NMS-AMQP-Test/Provider/Amqp/AmqpProviderFactoryTest.cs b/test/Apache-NMS-AMQP-Test/Provider/Amqp/AmqpProviderFactoryTest.cs
index 3bf5383..ea0de01 100644
--- a/test/Apache-NMS-AMQP-Test/Provider/Amqp/AmqpProviderFactoryTest.cs
+++ b/test/Apache-NMS-AMQP-Test/Provider/Amqp/AmqpProviderFactoryTest.cs
@@ -16,6 +16,7 @@
  */
 
 using System;
+using Amqp;
 using Apache.NMS.AMQP.Provider;
 using Apache.NMS.AMQP.Provider.Amqp;
 using NUnit.Framework;
@@ -26,7 +27,7 @@
     public class AmqpProviderFactoryTest
     {
         private uint customMaxHandle = 2048;
-        
+
         [Test]
         public void TestCreateAmqpProvider()
         {
@@ -38,21 +39,31 @@
         public void TestCreateWithDefaultOptions()
         {
             AmqpProvider provider = ProviderFactory.Create(new Uri("amqp://localhost:5672")) as AmqpProvider;
-            
+
             Assert.IsNotNull(provider);
             Assert.AreEqual(AmqpProvider.DEFAULT_MAX_HANDLE, provider.MaxHandle);
+            Assert.IsFalse(provider.TraceFrames);
         }
 
         [Test]
         public void TestCreateWithCustomOptions()
         {
-            Uri uri = new Uri("amqp://localhost:5672" + "?" +
-                              "amqp.maxHandle=" + customMaxHandle);
-            
+            Uri uri = new Uri("amqp://localhost:5672" +
+                              "?amqp.maxHandle=" + customMaxHandle +
+                              "&amqp.traceFrames=true");
+
             AmqpProvider provider = ProviderFactory.Create(uri) as AmqpProvider;
-            
+
             Assert.IsNotNull(provider);
             Assert.AreEqual(customMaxHandle, provider.MaxHandle);
+            Assert.IsTrue(provider.TraceFrames);
+        }
+
+        [TearDown]
+        public void TearDown()
+        {
+            // clean up trace level as it may interfere with other tests
+            Trace.TraceLevel = 0;
         }
     }
 }
\ No newline at end of file
diff --git a/test/Apache-NMS-AMQP-Test/TestAmqp/Logger.cs b/test/Apache-NMS-AMQP-Test/TestAmqp/Logger.cs
deleted file mode 100644
index ce24b3d..0000000
--- a/test/Apache-NMS-AMQP-Test/TestAmqp/Logger.cs
+++ /dev/null
@@ -1,89 +0,0 @@
-using System;
-using Apache.NMS;
-
-namespace NMS.AMQP.Test.TestAmqp
-{
-    class Logger : ITrace
-    {
-        public enum LogLevel
-        {
-            OFF = -1,
-            FATAL,
-            ERROR,
-            WARN,
-            INFO,
-            DEBUG
-        }
-
-        private LogLevel lv;
-
-        public void LogException(Exception ex)
-        {
-            this.Warn("Exception: " + ex.Message);
-        }
-
-        public Logger() : this(LogLevel.WARN)
-        {
-        }
-
-        public Logger(LogLevel lvl)
-        {
-            lv = lvl;
-        }
-
-        public bool IsDebugEnabled
-        {
-            get { return lv >= LogLevel.DEBUG; }
-        }
-
-        public bool IsErrorEnabled
-        {
-            get { return lv >= LogLevel.ERROR; }
-        }
-
-        public bool IsFatalEnabled
-        {
-            get { return lv >= LogLevel.FATAL; }
-        }
-
-        public bool IsInfoEnabled
-        {
-            get { return lv >= LogLevel.INFO; }
-        }
-
-        public bool IsWarnEnabled
-        {
-            get { return lv >= LogLevel.WARN; }
-        }
-
-        public void Debug(string message)
-        {
-            if (IsDebugEnabled)
-                Console.WriteLine("Debug: {0}", message);
-        }
-
-        public void Error(string message)
-        {
-            if (IsErrorEnabled)
-                Console.WriteLine("Error: {0}", message);
-        }
-
-        public void Fatal(string message)
-        {
-            if (IsFatalEnabled)
-                Console.WriteLine("Fatal: {0}", message);
-        }
-
-        public void Info(string message)
-        {
-            if (IsInfoEnabled)
-                Console.WriteLine("Info: {0}", message);
-        }
-
-        public void Warn(string message)
-        {
-            if (IsWarnEnabled)
-                Console.WriteLine("Warn: {0}", message);
-        }
-    }
-}
\ No newline at end of file
diff --git a/test/Apache-NMS-AMQP-Test/TestAmqp/NLogAdapter.cs b/test/Apache-NMS-AMQP-Test/TestAmqp/NLogAdapter.cs
new file mode 100644
index 0000000..326be86
--- /dev/null
+++ b/test/Apache-NMS-AMQP-Test/TestAmqp/NLogAdapter.cs
@@ -0,0 +1,30 @@
+using Apache.NMS;
+using NLog;
+
+namespace NMS.AMQP.Test.TestAmqp
+{
+    class NLogAdapter : ITrace
+    {
+        private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
+
+        public bool IsDebugEnabled => Logger.IsDebugEnabled;
+
+        public bool IsErrorEnabled => Logger.IsErrorEnabled;
+
+        public bool IsFatalEnabled => Logger.IsFatalEnabled;
+
+        public bool IsInfoEnabled => Logger.IsInfoEnabled;
+
+        public bool IsWarnEnabled => Logger.IsWarnEnabled;
+
+        public void Debug(string message) => Logger.Debug(message);
+
+        public void Error(string message) => Logger.Error(message);
+
+        public void Fatal(string message) => Logger.Fatal(message);
+
+        public void Info(string message) => Logger.Info(message);
+
+        public void Warn(string message) => Logger.Warn(message);
+    }
+}
\ No newline at end of file
diff --git a/test/Apache-NMS-AMQP-Test/TestAmqp/TestAmqpPeer.cs b/test/Apache-NMS-AMQP-Test/TestAmqp/TestAmqpPeer.cs
index 9a519f2..5646215 100644
--- a/test/Apache-NMS-AMQP-Test/TestAmqp/TestAmqpPeer.cs
+++ b/test/Apache-NMS-AMQP-Test/TestAmqp/TestAmqpPeer.cs
@@ -28,6 +28,7 @@
 using Amqp.Sasl;
 using Amqp.Types;
 using Apache.NMS.AMQP.Util;
+using NLog;
 using NMS.AMQP.Test.TestAmqp.BasicTypes;
 using NMS.AMQP.Test.TestAmqp.Matchers;
 using NUnit.Framework;
@@ -36,6 +37,8 @@
 {
     public class TestAmqpPeer : IDisposable
     {
+        private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
+        
         public static readonly string MESSAGE_NUMBER = "MessageNumber";
 
         private static readonly Symbol ANONYMOUS = new Symbol("ANONYMOUS");
@@ -93,6 +96,8 @@
 
         public bool OnFrame(Stream stream, ushort channel, DescribedList command, Amqp.Message message)
         {
+            Logger.Debug($"Received frame, descriptor={command.GetType().Name} on port: {ServerPort}");
+            
             var matcher = GetFirstMatcher();
             if (matcher != null)
             {
@@ -327,10 +332,19 @@
                     message.ApplicationProperties[MESSAGE_NUMBER] = i;
                 }
 
+                if (message.Properties == null)
+                    message.Properties = new Properties();
+                
+                message.Properties.MessageId = $"ID:{i.ToString()}";
+
+                var messageId = message.Properties.MessageId;
+
                 ByteBuffer payload = message.Encode();
 
                 flowMatcher.WithOnComplete(context =>
                 {
+                    Logger.Debug($"Sending message {messageId}");
+
                     var transfer = new Transfer()
                     {
                         DeliveryId = (uint) nextId,
@@ -340,7 +354,15 @@
                         Handle = context.Command.Handle,
                     };
 
-                    context.SendCommand(transfer, payload);
+                    try
+                    {
+                        context.SendCommand(transfer, payload);
+                    }
+                    catch (Exception e)
+                    {
+                        Logger.Error($"Sending message {messageId} failed.");
+                        throw;
+                    }
                 });
             }
 
@@ -837,6 +859,8 @@
 
         public void Close(bool sendClose = false)
         {
+            Logger.Info($"Closing {nameof(TestAmqpPeer)}: {this.ServerPort}");
+            
             if (sendClose)
             {
                 var close = new Close();
diff --git a/test/Apache-NMS-AMQP-Test/TestAmqp/TestAmqpPeerRunner.cs b/test/Apache-NMS-AMQP-Test/TestAmqp/TestAmqpPeerRunner.cs
index f0341cd..21f0687 100644
--- a/test/Apache-NMS-AMQP-Test/TestAmqp/TestAmqpPeerRunner.cs
+++ b/test/Apache-NMS-AMQP-Test/TestAmqp/TestAmqpPeerRunner.cs
@@ -23,12 +23,15 @@
 using Amqp;
 using Amqp.Framing;
 using Amqp.Types;
+using NLog.Fluent;
 using NMS.AMQP.Test.TestAmqp.BasicTypes;
 
 namespace NMS.AMQP.Test.TestAmqp
 {
     public class TestAmqpPeerRunner
     {
+        private static readonly NLog.Logger Logger = NLog.LogManager.GetCurrentClassLogger();
+        
         private readonly TestAmqpPeer testAmqpPeer;
         private readonly IPEndPoint ip;
         private Socket socket;
@@ -123,8 +126,9 @@
                     }
                 }
             }
-            catch
+            catch(Exception e)
             {
+                Logger.Info(e);
                 stream.Dispose();
             }
         }