Franz Deschler
Franz Deschler

Reputation: 2574

How to create different files for logger hierarchy in tomcat?

In my Tomcat application, I want to use two loggers to log general event informations and errors to two different files.

Logger eventLogger = Logger.getLogger("event");
Logger errorLogger = Logger.getLogger("error");

Now I want to do the following: the logs of the eventLogger should be written to a "events.log" file, and the errorLogger logs should be written in a "errors.log" file. All logs from any other logger (e.g. Tomcat logs) should be written to catalina.out (or any other default file).

How can I achive this with JULI? Or do I need a third party lib?

Upvotes: 2

Views: 1994

Answers (4)

jmehrens
jmehrens

Reputation: 11045

Tomcat JULI logging supports this only via the logging.properties located in the ${catalina.base}/config folder.

#Declares the handlers allowed for use.
handlers = 100catalina.org.apache.juli.FileHandler, 200catalina.org.apache.juli.FileHandler, 300catalina.org.apache.juli.FileHandler

 #Install the 'all' hander on the root logger.
.handlers=300catalina.org.apache.juli.FileHandler

#Install the 'event' handler on the 'event' logger and don't report to root.
event.handlers=100catalina.org.apache.juli.FileHandler
event.useParentHandlers=false

#Install the 'error' handler on the 'error' logger and don't report to root.
error.handlers=200catalina.org.apache.juli.FileHandler
error.useParentHandlers=false

#Event handler settings.
100catalina.org.apache.juli.FileHandler.level = ALL
100catalina.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
100catalina.org.apache.juli.FileHandler.prefix = event.

#Error handler settings.
200catalina.org.apache.juli.FileHandler.level = ALL
200catalina.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
200catalina.org.apache.juli.FileHandler.prefix = error.

#Root handler settings.
300catalina.org.apache.juli.FileHandler.level = ALL
300catalina.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
300catalina.org.apache.juli.FileHandler.prefix = all.

This config will not work if you try to install this file in the WEB-INF/classes/logging.properties. This is because the ClassLoaderLogManager doesn't allow you to install handlers on named loggers.

Upvotes: 0

Pablo Lozano
Pablo Lozano

Reputation: 10342

Tomcat documentation does not provide any way to define more than one file per application when using JULI. Actually it provides the steps to use log4j instead of it because JULI configuration can be too basic.

But again this configuration is at container level:

Note: The steps described in this section are needed when you want to reconfigure Tomcat to use Apache log4j for its own logging. These steps are not needed if you just want to use log4j in your own web application. — In that case, just put log4j.jar and log4j.properties into WEB-INF/lib and WEB-INF/classes of your web application.

So using a third party library is the logical choice and you can find how to configure it in this SO post

Upvotes: 0

xenteros
xenteros

Reputation: 15842

This can't be achieved with Juli. You might use log4j.

Basically you need appenders. They will manage the logs to go to separate files. Example configuration in xml:

<?xml version="1.0"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
    <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
        <layout class="org.apache.log4j.EnhancedPatternLayout">
            <param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%t][%c{1}:%L] %m%n" />
        </layout>
    </appender>

    <appender name="eventFILE" class="org.apache.log4j.DailyRollingFileAppender">
       <param name="File" value="@tomcat.home@/logs/event.log" />
       <param name="DatePattern" value="'.'yyyy-MM-dd" />
       <layout class="org.apache.log4j.PatternLayout">
          <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n"/>
       </layout>
    </appender>

    <appender name="errorFILE" class="org.apache.log4j.DailyRollingFileAppender">
       <param name="File" value="@tomcat.home@/logs/error.log" />
       <param name="DatePattern" value="'.'yyyy-MM-dd" />
       <layout class="org.apache.log4j.PatternLayout">
          <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n"/>
       </layout>
    </appender>

    <logger name="event" additivity="false">
        <level value="INFO" />
        <appender-ref ref="eventFILE" />
    </logger>

    <logger name="error" additivity="false">
        <level value="INFO" />
        <appender-ref ref="errorFILE" />
    </logger>

    <root>
        <priority value="INFO" />
        <appender-ref ref="FILE" />
    </root>
</log4j:configuration>

Upvotes: 1

chux
chux

Reputation: 701

you have to define an appender for each file in your log4j.xml and connect them to your loggers:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<!-- Appenders -->
<appender name="console" class="org.apache.log4j.ConsoleAppender">
    <param name="Target" value="System.out" />
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d{ISO8601} %5p [%c.%M:%L] - %m%n" />
    </layout>
</appender>

<appender name="FILE-error" class="org.apache.log4j.DailyRollingFileAppender">
    <param name="File" value="${catalina.base}/logs/error.log" />
    <param name="DatePattern" value="'.'yyyy-MM-dd" />
    <param name="ImmediateFlush" value="true" />
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d{ISO8601} %5p [%c.%M:%L] - %m%n" />
    </layout>
</appender>

<appender name="FILE-event" class="org.apache.log4j.DailyRollingFileAppender">
    <param name="File" value="${catalina.base}/logs/event.log" />       
    <param name="DatePattern" value="'.'yyyy-MM-dd" />
    <param name="ImmediateFlush" value="true" />
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss};%m%n" />
    </layout>
</appender>

<!-- Loggers -->
<logger name="error" additivity="false">
    <level value="warn" />
    <appender-ref ref="FILE-error" />
</logger>

<logger name="event" additivity="false">
    <level value="info" />
    <appender-ref ref="FILE-event" />
</logger>

<!-- Root Logger -->
<root>
    <priority value="warn" />
    <appender-ref ref="FILE-error" />
</root>
</log4j:configuration>

Upvotes: 0

Related Questions