1. The UlsLogAppender wrote to the TraceProvider the value of LoggingEvent.RenderedMessage. This was incorrect, as, for example, in case of logger.Error(msg, exception) calls it contained only the msg part, omitting the exception. Now it writes the value of the call to RenderLoggingEvent(loggingEvent).
2. At fmorriso's suggestion (thanks!), the TraceProvider class doesn't call Debug.Assert anymore, but instead returns true or false from methods such as RegisterTraceProvider and UnregisterTraceProvider. The UlsLogAppender has also been modified to take the result into account.
1. In the LoggerWrapper class, change the value of the LoggerMessagePrefix variable to a prefix of your choice. All messages logged with the logger will be prefixed with this string. Useful if you want to use a utility like SPTraceView and filter out other messages.
3. Use (don't forget to configure your application for log4net, that is .config file and maybe XmlConfigurator attribute ;))