I had a similar problem and decided to inherit it from ForwardingAppender and then modified the LoggingEvent (using reflection) before passing it on.
using System.Reflection; using log4net.Appender; using log4net.Core; class MessageModifyingForwardingAppender : ForwardingAppender { private static FieldInfo _loggingEventm_dataFieldInfo; public MessageModifyingForwardingAppender() { _loggingEventm_dataFieldInfo = typeof(LoggingEvent).GetField("m_data", BindingFlags.Instance | BindingFlags.NonPublic); } protected override void Append(LoggingEvent loggingEvent) { var originalRenderedMessage = loggingEvent.RenderedMessage; var newMessage = GetModifiedMessage(originalRenderedMessage); if (originalRenderedMessage != newMessage) SetMessageOnLoggingEvent(loggingEvent, newMessage); base.Append(loggingEvent); }
It is not very beautiful, but it works.
Then you need the log4net configuration, which looks something like this:
<log4net> <appender name="ModifyingAppender" type="Your.Lib.Log4Net.MessageModifyingForwardingAppender,Your.Lib"> <appender-ref ref="ConsoleAppender" /> </appender> <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender"> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date %-5level [%thread] %logger: %message%newline"/> </layout> </appender> <root> <level value="INFO"/> <appender-ref ref="ModifyingAppender"/> </root> </log4net>
and an implementation of GetModifiedMessage() that suits your needs and you're out!
Chris priest
source share