Putting called delegate into AsyncState parameter - Pros/cons?
To answer your question:


you can access the delegate instance by reading ((AsyncResult)asyncResult).AsyncDelegate property (see Executing a Callback Method When an Asynchronous Call Completes section of Calling Synchronous Methods Asynchronously). But it will be easier to cache the instance of the delegate in a readonly field and use it in both methods.
yes, you can use AsyncState however you want, and sometimes people use it for passing the delegate being invoked


Note that you're using a separate thread (on a threadpool) each time you write something to log, so there will be contention between multiple threads if you write to log quickly enough. I would recommend using existing logging frameworks like NLog or log4net to avoid inventing a wheel.