if (info == XLOG_LOGICAL_MESSAGE)
     {
         xl_logical_message *xlrec = (xl_logical_message *) rec;
 +       char       *prefix = xlrec->message;
 +       char       *message = xlrec->message + xlrec->prefix_size;
 +       char       *sep = "";
  
 -       appendStringInfo(buf, "%s message size %zu bytes",
 -                        xlrec->transactional ? "transactional" : "nontransactional",
 -                        xlrec->message_size);
 +       Assert(prefix[xlrec->prefix_size] != '\0');
 +
 +       appendStringInfo(buf, "%s, prefix \"%s\"; payload (%zu bytes): ",
 +                        xlrec->transactional ? "transactional" : "non-transactional",
 +                        prefix, xlrec->message_size);
 +       /* Write message payload as a series of hex bytes */
 +       for (int cnt = 0; cnt < xlrec->message_size; cnt++)
 +       {
 +           appendStringInfo(buf, "%s%02X", sep, (unsigned char) message[cnt]);
 +           sep = " ";
 +       }
     }
  }
  
          
     xlrec.dbId = MyDatabaseId;
     xlrec.transactional = transactional;
 +   /* trailing zero is critical; see logicalmsg_desc */
     xlrec.prefix_size = strlen(prefix) + 1;
     xlrec.message_size = size;
  
             bool        transactional;  /* is message transactional? */
     Size        prefix_size;    /* length of prefix */
     Size        message_size;   /* size of the message */
 -   char        message[FLEXIBLE_ARRAY_MEMBER]; /* message including the null
 -                                                * terminated prefix of length
 -                                                * prefix_size */
 +   /* payload, including null-terminated prefix of length prefix_size */
 +   char        message[FLEXIBLE_ARRAY_MEMBER];
  } xl_logical_message;
  
  #define SizeOfLogicalMessage   (offsetof(xl_logical_message, message))