1. A method of recording data communicated between a first virtual machine and a second virtual machine, the method comprising: sending a configurable amount of data from the first virtual machine to a first queue, the first queue having a first header section and a first data section, the first header section configured to store a read-protected head pointer that represents a starting address of data in the first data section, the first header section further configured to store a write-protected tail pointer that represents an ending address of the data in the first data section; appending the first data section with the sent data; updating the write-protected tail pointer in the first header section to represent an updated ending address of the data in the first data section with an addition of the appended data; receiving a page fault from updating the write-protected tail pointer; and handling the page fault by recording the data to a log file and copying the data from the first queue to a second queue, the second queue being a shadow copy of the first queue, and enabling the second virtual machine to access the copy of the data in the second queue.