Friday, April 29, 2011

How can I direct log4j output so that different log levels go to different appenders?

Is it possible to have "debug" and "info" output written to the console while the "info" output is only written to some log file? For example, given this logging:

LOG.debug(fileContent);
LOG.info(fileLength);

What does a corresponding log4j.xml look like?

From stackoverflow
  • That is definitely possible. The configuration would look something like this (not checked for syntactic correctness):

    <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
        <appender name="console" class="org.apache.log4j.ConsoleAppender">
            ...
        </appender>
    
        <appender name="otherAppender"
                  class="org.apache.log4j.FileAppender FileAppender">
            ...
        </appender>
    
        <logger name="com.mycompany.mypackage.MyClass">
            <level        value="info"/>
            <appender-ref ref="otherAppender" />
        </logger>
    
        <root>
            <priority     value="debug" />
            <appender-ref ref="console" />
        </root>
    </log4j:configuration>
    

    All debug and info messages go to the console appender. Info messages go to otherAppender.

    Eddie : +1, I would have answered this but you beat me to it.
    Eddie : I made some small edits to your answer. hope this is OK.
    Ronald Wildenberg : That's ok :) Thanks!
  • Go to this page for some examples.

    It's as simple as adding two different appenders to your program, one appender for each type of logging you want to do.

  • With the configuration from Eddie I can only get the "info" output for MyClass. But what I would like to have is that the "info" output of MyClass goes to a file AND the "debug" output of MyClass goes to console.

  • Do as rwwilden suggested but remove this part

    <logger name="com.mycompany.mypackage.MyClass">

    <level value="info"/>

    <appender-ref ref="otherAppender" />

    </logger>

    Add <param name="Threshold" value="INFO"/> under the otherAppender.

  • Ok, I've got it now:

    <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
        <appender name="console" class="org.apache.log4j.ConsoleAppender">
            ...
        </appender>
    
        <appender name="otherAppender"
                  class="org.apache.log4j.FileAppender FileAppender">
           <param name="Threshold" value="INFO"/>
            ...
        </appender>
    
        <root>
            <priority     value="debug" />
            <appender-ref ref="console" />
            <appender-ref ref="otherAppender" />
        </root>
    </log4j:configuration>
    

    Thanks for your help!

0 comments:

Post a Comment

Note: Only a member of this blog may post a comment.