I suppose you could write a circular buffer into flash, but you risk shortening the life of your product.
For ad-hoc use, you can have people telnet into the X2 and do the "set trace state=on mask=printf:*" to see your print statements in realtime as they occur.
If you want something formal with a better history which you control, the you could write a simple thread-based buffer which waits for a telnet-like connection, then dumps perhaps the last 50 "messages" upon connection, then shows new messages in realtime as they are passed to this thread. This would give you some ability to have some print-like messages real-time only & not buffered, while others might buffer.
Since you are using the X2, you'd need to be careful with memory usage, plus manually force garbage collection at the appropriate times since the 'print' strings will need to be detected as freeable periodically.