Rajas Gujarathi
Rajas Gujarathi

Reputation: 774

Apache Log4j2 package specific logging using log4j2.xml

I am using log4j2. But the problem that I am facing is that it logs all logs. I want to ... log from specific package to a specific file & other package to another file. I am using log4j2.xml for configuration. Please can someone help?

log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>

<Loggers>
    <Root level="DEBUG" additivity="false">
        <AppenderRef level="DEBUG" ref="CONSOLE" />
        <AppenderRef level="DEBUG" ref="fileAppender" />
    </Root>
    <Logger name="com.pkg.test.logging.method" level="DEBUG"
        additivity="false">
        <Appender-ref ref="fileAppender" level="DEBUG" />
    </Logger>

</Loggers>

<Appenders>

    <Console name="CONSOLE" target="SYSTEM_OUT">
        <PatternLayout
            pattern="%highlight{[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %c{1}: %L - %msg%n%throwable}" />
    </Console>

    <RollingFile name="fileAppender" fileName="./log.log"
        filePattern="./log-%d{yyyy-MM-dd}.log">
        <PatternLayout
            pattern="%highlight{[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %c{1}: %L - %msg%n}" />
        <Policies>
            <TimeBasedTriggeringPolicy interval="1"
                modulate="true" />
        </Policies>
    </RollingFile>
</Appenders>

Upvotes: 23

Views: 43875

Answers (3)

Binita Bharati
Binita Bharati

Reputation: 5898

The <Loggers> section of the config looks correct. But, if all other logs not belonging to the expected package is also getting logged, it is the Root logger which is responsible for these logs, and not the package level logger. It may not be active because of the way you are creating the logger instance in your code. E.g: If one is using slf4j to create the logger instance, then this is how we would need to create the logger instance:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

Logger logger = LoggerFactory.getLogger(Test.class);

If one gets the logger instance using - Logger logger = LoggerFactory.getLogger("Test") then, the config will not work as expected.

Also, another answer mentioned that the solution was to remove the fileAppender that the package logger was using from the root logger. This, in fact, is not a problem. You are free to use the same appenders in root and package level logger. My answer in context of log4j-api 2.14.1

Upvotes: 1

Rajas Gujarathi
Rajas Gujarathi

Reputation: 774

Just answered the question.

log4j2.xml

    <?xml version="1.0" encoding="UTF-8"?>
<Loggers>
    <Root level="DEBUG" additivity="false">
        <AppenderRef level="DEBUG" ref="CONSOLE" />
     </Root>
    <Logger name="com.pkg.test.logging.method" level="DEBUG"
        additivity="false">
        <Appender-ref ref="fileAppender" level="DEBUG" />
    </Logger>

</Loggers>

<Appenders>

    <Console name="CONSOLE" target="SYSTEM_OUT">
        <PatternLayout
            pattern="%highlight{[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %c{1}: %L - %msg%n%throwable}" />
    </Console>

    <RollingFile name="fileAppender" fileName="./log.log"
        filePattern="./log-%d{yyyy-MM-dd}.log">
        <PatternLayout
            pattern="%highlight{[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %c{1}: %L - %msg%n}" />
        <Policies>
            <TimeBasedTriggeringPolicy interval="1"
                modulate="true" />
        </Policies>
    </RollingFile>
</Appenders>

Removed the <AppenderRef level="DEBUG" ref="fileAppender" /> from root logger. Thus it started logging logs based on packages.

Upvotes: 17

bilgec
bilgec

Reputation: 161

From Log4J Manual:

Adding a specific logger for a class: (you can refer to packages here too)

<Logger name="org.apache.logging.log4j.test2" level="debug" additivity="false">
  <AppenderRef ref="File"/>
</Logger>

Adding a specific appender:

<Appender type="File" name="File" fileName="${filename}">
  <Layout type="PatternLayout">
    <Pattern>%d %p %C{1.} [%t] %m%n</Pattern>
  </Layout>
</Appender>

Upvotes: 7

Related Questions