Search code examples
javalog4jlog4j2

Log4j not working with multiple appenders


I´m trying to create a simple Login using Apache Tomcat and Java. For this I want to log to two different files.

@WebServlet("/login")
public class ServletLogin extends HttpServlet {

    private static final Logger logger = LogManager.getLogger(ServletLogin.class);

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        String username = request.getParameter("username");
        String password = request.getParameter("password");

        if (username != null && !username.isEmpty() && password != null && !password.isEmpty()) {
            if (login(WebServletContextListener.db1, username, password)) {
                HttpSession session = request.getSession();
                session.setAttribute("username", username);
                session.setAttribute("loggedIn", true);
                logger.info("Login succeeded for user: {}", username);
                logger.debug("Further information...");
                response.sendRedirect("jsp/management.jsp");
                return;
            } else {
                logger.info("Login failed for user: {}", username);
                 logger.debug("Further information...");
            }
        }
        response.sendRedirect("jsp/login.jsp?error=1");
    }

This is the corresponding log4j2.xml file:

<Configuration status="WARN">
    <Appenders>
        <!-- Define a File appender -->
        <File name="LogHistoryFile" fileName="logs\history.${date:yyyy-MM-dd}.log">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
        </File>
        <File name="LogDebugFile" fileName="logs\debug.${date:yyyy-MM-dd}.log">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
        </File>
    </Appenders>
    <Loggers>
        <!-- Reference a File appender -->
        <Root level="info">
            <AppenderRef ref="LogHistoryFile" />
        </Root>
    </Loggers>
</Configuration>

Unfortunately, when adding to the log4j2.xml a second appender, nothing at all gets logged anymore.

<Root level="debug">
   <AppenderRef ref="LogDebugFile" />
</Root>

Maybe somebody of you have an idea what problem I´m dealing with or even has a thread where this topic has been discussed before.

Thanks for your help!


Solution

  • I am not 100% sure what do you want to archive. But from what I understand, you will filter the message in the different files.

    If yes you can add a ThresholdFilter for the different Appender:

    <Configuration status="WARN">
        <Appenders>
            <!-- Define a File appender -->
            <File name="LogHistoryFile" fileName="logs\history.${date:yyyy-MM-dd}.log">
                <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
                <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
            </File>
            <File name="LogDebugFile" fileName="logs\debug.${date:yyyy-MM-dd}.log">
                <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
                <ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>            
            </File>
        </Appenders>
        <Loggers>
            <!-- Reference a File appender -->
            <Root level="debug">
                <AppenderRef ref="LogHistoryFile" />
                <AppenderRef ref="LogDebugFile" />
            </Root>
        </Loggers>
    </Configuration>