Rather than having the other thread marshal back to the UI thread just to read data from a control, pull the string text out of the control before string the thread and then provide that string to the new thread when creating it. The easiest way of doing this is through a lambda that closes over the information:
string text = control.Text;
Thread thread = new Thread(() => WriteLog(text));
thread.Start();
Then just add a string parameter to WriteLog
for the data. You can do this for each piece of information needed.
Beyond simply preventing cross thread exception errors, a key aspect of this design is that you have now separated your business logic from your user interface, which makes the application much easier to maintain going forward.