Hi Curt:
Thanks for your clarification on this. I'm really
appreciate. At least I know where to focus now.
I need to capture all log4j rendered message as String
and remove something from the message if necessary to
address an issue of log injection attack.
I can get the same kind of your results now after
making some changes to that render example. But the
String has been bypassed in the doRender. I have
tried the
<renderer renderedClass="java.lang.Object"
<renderer renderedClass="java.lang.String"
I guess the doRender() method is the deadend for my
purpose.
The filter that I tried is not useful either since
LoggingEvent object I can use to do
getMessage()/getRenderedMessage() but there is no
setMessage()/setRenderedMessage() in log4j version
1.2.14 to change the message for me so that it's not
useful to my purpose.
<appender name="STDOUT"
class="org.apache.log4j.ConsoleAppender">
<param name="Threshold" value="debug" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern"
value="%d %-5p [%t] %C{2} (%F:%L) - %m%n" />
</layout>
<filter
class="com.test.logging.log4j.filter.MyStringFilter"/>
</appender>
I'll start to look what I can do with Layouts for the
message %m. I'm new to this area and I'm not sure
where to start with Layouts to intercept the %m in the
Layouts but I'll start to do some searching for it.
Can Layouts be able to alter message or if I can get a
quick example to see how to use it to get to the
message part. Also can I do something so that Layouts
can be extended to apply to all the appender in one
shot or I need to customize the Layout for each
Appender?
Thanks again for your assistance.
Naider
--- Curt Arnold <[EMAIL PROTECTED]> wrote:
>
> On Jun 6, 2007, at 9:59 AM, Naider Chen wrote:
>
> > Hi:
> >
> > Can any one confirm to me it's working to call
> > doRender() method. I'll appreciate if you can
> provide
> > me a successful example if you do make it work. I
> use
> > log4j-1.2.14 in RAD6 and put log4j.xml in the
> > WEB-INF/classes folder and I'm sure the added
> > <renderer> has been loaded.
>
>
> There is an ORTestCase in the test suite (and which
> currently
> passes), but the tests are inadequate to ensure that
> doRender is
> being called in normal processing.
>
> >
> > I tried the complete example from
> >
> > http://www.java2s.com/Code/Java/Language-Basics/
> > log4jAcompleteexample.htm
> >
> >
> > but the doRender() was never got called and it's
> not
> > calling to my own test to add <renderer> to the
> > log4j.xml and extend ObjectRenderer in my render
> class
> > with doRender() method.
> >
> > I just have to know if this is the right way to
> call
> > doRender() and capture the message to change it.
>
> There are a multitude of errors in that sample, but
> if you fix all of
> them, the OrderRenderer.doRender is called using
> log4j 1.2.14. To
> get the sample to run, I needed to:
>
> Remove non-breaking spaces from the source
> Make all the classes "public" and place them in
> separate files named
> after the classes.
> Extract the sample configuration file from the end
> of the sample and
> name it log4j.xml
> Remove the asterisks used to comment out the
> configuration file
> remove the space between <renderer> and </renderer>
> Change the name of the logger in the configuration
> from
> "com.apress.logging.log4j" to "name"
> Remove all the com.apress.* package names from the
> configuration file
> since the Java source did not have any package
> statements.
>
> If you did that, the output of the sample program
> was:
>
> main INFO name - Beer-101-20
> main INFO name - Chocolate-223-5
>
> If you commented out the renderer element, you got:
>
> main INFO name - [EMAIL PROTECTED]
> main INFO name - [EMAIL PROTECTED]
>
> >
> > I tried what Ron has suggested me to use
> LoggingEvent
> > object to filter the message to do getMessage()
> and
> > getRenderedMessage(). but it's not good to me
> since
> > there are no setRenderedMessage() to alter the
> message
> > that I want to return.
> >
>
> >
> >
> > --- Naider Chen <[EMAIL PROTECTED]> wrote:
> >
> >> Thanks Ron:
> >>
> >> Thank you for your reply and I really appreciate
> it.
> >>
> >>
> >> May be The getRenderedMessage method in the
> >> LoggingEvent is another place that I can
> intercept
> >> the
> >> log message. But I'm just beginning to look how
> to
> >> use log4j and I need to do some more research to
> >> find
> >> out how do I overwrite the getRenderedMessage
> method
> >> to scan and pre-process the message. Can I
> extend
> >> the
> >> LoggingEvent and do something to have log4j use
> my
> >> child LoggingEvent method so that I can do what I
> >> need
> >> to do with the message.
> >>
> >>
> >> What I really need to do is to create a utilities
> to
> >> be used to plug in to the application code so
> that
> >> all
> >> the log message can be scanned/pre-processed
> before
> >> sending to the Appender. And of course the
> >> application code need to do the little the
> better.
> >>
>
> You needs would appear to be better served with
> either a Filter or
> Layout. An object renderer would only get invoked
> when a object
> other than a String is passed as the message and
> custom renderer is
> associated with the type. Filters or Layouts would
> see all logging
> requests, an ObjectRenderer would only see the
> subset that uses your
> special type.
>
> >>
> >> I'm sure the added <renderer> tag in my log4j.xml
> is
> >> loaded in my server but what I don't understand
> is
> >> that the doRender method is not get called.
> Could
> >> that be because a String object is been bypassed
> >> because it's already a String so that there is no
> >> need
> >> to render it again?
> >> I thought the doRender(object
> >> o)
> >> will catch all the object. Is this right?
> >>
> >>
> >> It this doRender approach the deadend to
> intercept
> >> the
> >> message or I can still catch a String object in
> >> doRender?
> >>
>
> There is a check in
> LoggingEvent.getRenderedMessage() that bypasses
> rendering if the message is already a string. That
> behavior can't be
> changed at this date. You can't use an
> ObjectRenderer to manipulate
> the message, however you may be able to use a Layout
> to get what you
> want.
>
> >>
> >> I have changed the
> renderedClass="java.lang.Object"
> >> to
> >> Object instead of String but it's the same thing
> >> doRender method print statement can't be found in
> my
> >> consoleAppender.
>
> The rendered class is used as a key into a map of
> renders in
> org.apache.log4j.or.RendererMap.findAndRender().
> When searching for
> a renderer the value from msg.getClass() is used on
> the lookup, so a
> Renderer will only match precisely the class
> specified as the
> rendered class. So if a renderer is registered for
>
> "java.lang.Object", the renderer would only get
> invoked if you were
> making calls like:
>
> logger.debug(new Object());
>
> >>
> >> <log4j:configuration
> >> xmlns:log4j="http://jakarta.apache.org/log4j/"
> >> debug="true">
> >> <renderer renderedClass="java.lang.Object"
> >> renderingClass="test.log4j.LogCatcher"/>
> >>
> >>
> >> Here's the ocnsole log that shows the new
> <renderer>
> >> tag showned in the logger.
> >>
> >> [6/1/07 15:28:09:453 EDT] 0000002a SystemOut
> O
> >> log4j: Rendering class: [test.log4j.LogCatcher],
> >> Rendered class: [java.lang.Object].
> >> [6/1/07 15:28:09:453 EDT] 0000002a SystemOut
> O
> >> log4j: Level value for root is [debug].
> >> [6/1/07 15:28:09:453 EDT] 0000002a SystemOut
> O
> >> log4j: root level set to DEBUG
> >> [6/1/07 15:28:09:469 EDT] 0000002a SystemOut
> O
> >> log4j: Class name:
> >> [org.apache.log4j.ConsoleAppender]
> >> [6/1/07 15:28:09:500 EDT] 0000002a SystemOut
> O
> >> log4j: Setting property [threshold] to [DEBUG].
> >> [6/1/07 15:28:09:500 EDT] 0000002a SystemOut
> O
> >> log4j: Parsing layout of class:
> >> "org.apache.log4j.PatternLayout"
> >> [6/1/07 15:28:09:657 EDT] 0000002a SystemOut
> O
> >> log4j: Setting property [conversionPattern] to
> [%d
> >> %-5p [%t] %C{2} (%F:%L) - %m%n].
> >> [6/1/07 15:28:09:657 EDT] 0000002a SystemOut
> O
> >> log4j: Adding appender named [STDOUT] to category
> >> [root].
> >> [6/1/07 15:28:09:672 EDT] 0000002a ServletWrappe
> A
> >> SRVE0242I: [TestCsfEAR] [/x]
> [EntitlementServlet]:
> >> Initialization successful.
> >> [6/1/07 15:28:09:704 EDT] 0000002a SystemOut
> O
> >> 2007-06-01 15:28:09,704 ERROR [WebContainer : 1]
> >> log4j.EntitlementServlet
> >> (EntitlementServlet.java:59)
> >> - log this info !!@@##$$%%^^&&**()++
> >>
> >>
> >> --- "Gallagher, Ron" <[EMAIL PROTECTED]> wrote:
> >>
> >>> Naider --
> >>>
> >>> The purpose of Renderers is to generate a String
> >>> representation of an
> >>> Object. Since a String is already a String,
> >> there's
> >>> no need to do any
> >>> additional rendering.
> >>>
> >>> The getRenderedMessage method in the
> LoggingEvent
> >> is
> >>> what is responsible
> >>> for calling any defined renderers. This method
> >> has
> >>> an explicit check
> >>> for situations where the object that's about be
> >>> rendered is an instance
> >>> of String. In that case, the Object to render
> is
> >>> simply cast into a
> >>> String and used as-is.
> >>>
> >>>
> >>> Ron Gallagher, AT&T Mobility
> >>>
>
> That's right.
>
>
>
>
> >>>
> >>> -----Original Message-----
> >>> From: Naider Chen [mailto:[EMAIL PROTECTED]
> >>> Sent: Thursday, May 31, 2007 5:26 PM
> >>> To: Log4J Users List
> >>> Subject: Unable to call doRender. Am I missing
> >>> anything?
> >>>
> >>> I'm trying to intercept the logging message to
> >>> filter
> >>> some keyword before forwarding to the
> destination.
> >>
> >>> I
> >>> tested it in a windows environment using RAD6
> >>>
> >>> I add the new <renderer> tag entry to log4j.xml
> >> and
> >>> put both log4j.dtd and log4j.xml in the
> >>> WEB-INF/classes folder but after I re-compile
> and
> >>> bounce the server the doRender method was never
> >> get
> >>> called.
> >>>
> >>> Am I missing snything? Please help. Thanks.
> >>>
> >>> <renderer renderedClass="java.lang.String"
> >>> renderingClass="test.log4j.LogCatcher"/>
> >>>
> >>> I create a new class test.log4j.LogCatcher as
> >>> follows:
> >>>
> >>> package test.log4j;
> >>> import org.apache.log4j.*;
> >>> import org.apache.log4j.spi.*;
> >>> import org.apache.log4j.or.ObjectRenderer;
> >>>
> >>> public class LogCatcher implements
> ObjectRenderer
> >> {
> >>>
> >>> public String doRender(Object arg0) {
> >>> String st = arg0.toString();
> >>> System.out.println("LogCatcher doRender
> >> **********
> >>> log string catched = *" + st + "*");
> >>> return st;
> >>> }
> >>> }
> >>>
>
>
>
> Might be good if you try to explain exactly what you
> are trying to
> do. From what you describe, it seems like a Filter
> or Layout is much
> better fit than an ObjectRenderer.
>
>
>
>
>
____________________________________________________________________________________
Choose the right car based on your needs. Check out Yahoo! Autos new Car
Finder tool.
http://autos.yahoo.com/carfinder/
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]