internal static void Trace(this ProtocolHeader header, bool send, AmqpConnection connection)
        {
            if (!AmqpTrace.AmqpDebug)
            {
                return;
            }

            string message = string.Format(
                "{0} [{1:X3}.{2:X3} {3:HH:mm:ss.fff}] {4} {5}",
                AppDomain.CurrentDomain.FriendlyName,
                Process.GetCurrentProcess().Id,
                Environment.CurrentManagedThreadId,
                DateTime.UtcNow,
                send ? "SEND" : "RECV",
                header.ToString());

            if (AmqpTrace.TraceCallback != null)
            {
                AmqpTrace.TraceCallback(message);
            }
            else
            {
                System.Diagnostics.Trace.WriteLine(message);
            }
        }
        internal static void Trace(this Frame frame, bool send, AmqpConnection connection)
        {
            if (!AmqpTrace.AmqpDebug)
            {
                return;
            }

            if (AmqpTrace.FrameCallback != null)
            {
                AmqpTrace.FrameCallback(send, connection, frame);
            }
            else
            {
                StringBuilder sb = new StringBuilder(1024);
                sb.AppendFormat(
                    "{0} [{1:X3}.{2:X3} {3:HH:mm:ss.fff}] {4} FRM({5:X4}|{6}|{7}|{8:X2}",
                    AppDomain.CurrentDomain.FriendlyName,
                    Process.GetCurrentProcess().Id,
                    Environment.CurrentManagedThreadId,
                    DateTime.UtcNow,
                    send ? "SEND" : "RECV",
                    frame.Size,
                    frame.DataOffset,
                    frame.Type,
                    frame.Channel);
                if (frame.Command != null)
                {
                    sb.Append(' ');
                    sb.Append(frame.Command);
                }

                if (frame.Payload.Count > 0)
                {
                    sb.Append(' ');
                    frame.Payload.GetString(128, sb);
                }

                sb.Append(')');

                if (AmqpTrace.TraceCallback != null)
                {
                    AmqpTrace.TraceCallback(sb.ToString());
                }
                else
                {
                    System.Diagnostics.Trace.WriteLine(sb.ToString());
                }
            }
        }