IObjectRender was designed to allow custom objects (i.e. non-value objects) to
be formatted. log4net optmizes string messages by bypassing the IObjectRenderer
code. I don't think a lot of people use IObjectRender. If you want to use an
object renderer you can wrap your sensitive messages like this:
SensitiveString sensitiveString = new SensitiveString("My password is 1234");
log.Info(sensitiveString);
then register the renderer for the SensitiveString class. I'd probably write a
ForwardingAppender or a Filter that alters the message before the real Appender
receives the message.
----- Original Message ----
From: Lars Bjønnes <[EMAIL PROTECTED]>
To: [email protected]
Sent: Thursday, October 2, 2008 2:44:52 PM
Subject: Replacing text in log messages
Hello,
I am trying to replace certain text strings in log messages, based on
a regular expression. The goal is to prevent sensitive information
being logged.
Is there any easy way of doing this?
I have so far tried to write a simple implementation of the
IObjectRenderer as a small end to end test
namespace Log4netRegexpRenderer
{
public class RegexpObjectRenderer : IObjectRenderer
{
/// <summary>
/// Proceed to rendering for a given object.
/// </summary>
public string DoRender(RendererMap rendererMap, object obj)
{
return "Yeah, we're getting somehwere";
}
}
}
Then adding this to log4net.config:
<renderer
renderingClass="Log4netRegexpRenderer.RegexpObjectRenderer,
Log4netRegexpRenderer" renderedClass="System.String, mscorlib" />
When I set the internal debug property in log4net to true, I can see
that my assembly is pickedup and that there indeed is initialized an
instance of my RegexpObjectRenderer.
However, it never calls DoRender in my custom object renderer. Is it
possible to catch System.String/string by (mis)using the
ObjectRenderer, or do I have to use custom objects? (Which works fine)
(I have no problems getting a custom renderer to work with my own
custom classes, but no luck with System.String).
Suggestions?
Regards,
Lars