Haven't seen this mentioned yet, but I've found that the built-in System.Diagnostics TraceSource and TraceListeners are very powerful for logging. We've built a number of high-performance custom TraceListeners for different data sources we persist logs to.
We swap in and out different listeners in the config file all the time. We take advantage of System.Diagnostics.CorrelationManager to walk chain of execution through many servers, processes and threads via logs.
All in all we have a sophisticated logging solution built on top of what came with the framework, and I'm very happy with it.