Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

tomcat 7 internal logging with log4j2.xml

I am trying to configure tomcat 7 internal logging with log4j2. I have followed the answer provided at Logging server classes in Tomcat 6 with log4j2.

I am using tomcat 7.0.54, and log4j-core-2.1.jar, log4j-api-2.1.jar. I have down loaded the extras and did all the steps below, but when I start tomcat, I get an error:

ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console.

These are the steps I performed:

  • put log4j2.xml in $CATALINA_BASE/lib
  • download tomcat-juli.jar and tomcat-juli-adapters.jar from "extras"
  • put log4j-api-2.1.jar, log4j-core-2.1.jar, log4j-jul-2.1.jar, and tomcat-juli-adapters.jar from "extras" into $CATALINA_HOME/lib.
  • replace $CATALINA_HOME/bin/tomcat-juli.jar with tomcat-juli.jar from "extras".
  • delete $CATALINA_BASE/conf/logging.properties
  • set the logging manager to use the manager from the log4j2-jul bridge (log4j-jul-2.1.jar). Alter catalina.sh to ensure that the classpath includes bin/tomcat-juli.jar, lib/log4j-jul-2.1.jar, lib/log4j-api-2.1.jar and lib/log4j-core-2.1.jar, and the command used to start tomcat includes -Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager`

I even tried adding this (LOGGING_CONFIG="-Djava.util.logging.config.file=$CATALINA_HOME/lib/log4j2.xml") in catalina.sh but didn't work.

Please let me know if anyone could configure it successfully.

like image 863
Paramita Banerjee Avatar asked Feb 11 '15 03:02

Paramita Banerjee


3 Answers

For Docker you can use the following approach.

1 Add a Maven plugin to copy the dependancies to the target directory:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <version>3.3.0</version>
    <executions>
        <execution>
            <id>copy</id>
            <phase>package</phase>
            <goals>
                <goal>copy</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <artifactItems>
            <artifactItem>
                <groupId>org.apache.logging.log4j</groupId>
                <artifactId>log4j-api</artifactId>
                <version>${log4j.version}</version>
                <destFileName>log4j-api.jar</destFileName>
            </artifactItem>
            <artifactItem>
                <groupId>org.apache.logging.log4j</groupId>
                <artifactId>log4j-core</artifactId>
                <version>${log4j.version}</version>
                <destFileName>log4j-core.jar</destFileName>
            </artifactItem>
            <dependency>
                <groupId>org.apache.logging.log4j</groupId>
                <artifactId>log4j-jul</artifactId>
                <version>${log4j.version}</version>
                <destFileName>log4j-jul.jar</destFileName>
            </dependency>
            <dependency>
                <groupId>com.lmax</groupId>
                <artifactId>disruptor</artifactId>
                <version>3.4.2</version>
                <destFileName>disruptor.jar</destFileName>
            </dependency>
        </artifactItems>
        <outputDirectory>${project.build.directory}</outputDirectory>
        <overWriteReleases>false</overWriteReleases>
        <overWriteSnapshots>true</overWriteSnapshots>
    </configuration>
</plugin>

2 Add a setenv.sh to your repo:

CLASSPATH=/usr/local/tomcat/lib/log4j-api.jar:/usr/local/tomcat/lib/log4j-core.jar:/usr/local/tomcat/lib/log4j-jul.jar:/usr/local/tomcat/lib/disruptor.jar
LOGGING_MANAGER=-Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager

3 Finally create a Dockerfile

FROM tomcat:8.5-jre8-openjdk-slim

# Copy log4j2.
COPY --chmod=0755 setenv.sh /usr/local/tomcat/bin/setenv.sh
COPY target/log4j-api.jar /usr/local/tomcat/lib/log4j-api.jar
COPY target/log4j-core.jar /usr/local/tomcat/lib/log4j-core.jar
COPY target/log4j-jul.jar /usr/local/tomcat/lib/log4j-jul.jar
COPY target/disruptor.jar /usr/local/tomcat/lib/disruptor.jar


# Delete default logging file
RUN rm -rf /usr/local/tomcat/conf/logging.properties

COPY target/classes/log4j2-fargate.xml /usr/local/tomcat/lib/log4j2.xml

COPY target/salesapp-cloudcache.war /usr/local/tomcat/webapps/ROOT.war

ENV JAVA_OPTS="-Dlog4j2.configurationFile=/usr/local/tomcat/lib/log4j2.xml"
EXPOSE 8080

CMD ["catalina.sh", "run"]

4 Then build and run your Docker container.

like image 144
rjdkolb Avatar answered Sep 18 '22 14:09

rjdkolb


I took the following steps and it worked for me.

  1. Put the following jars in $CATALINA_HOME/lib
    • log4j 2 core (log4j-core-2.4.1.jar)
    • log4j 2 api (log4j-api-2.4.1.jar)
    • log4j 2 bridge for log4 j 1.0 (log4j-1.2-api-2.4.1.jar)
    • tomcat-juli-adapters.jar from tomcat extras
  2. Replace existing $CATALINA_HOME/bin/tomcat-juli.jar with the tomcat-juli.jar from tomcat extras
  3. Delete the file $CATALINA_HOME/conf/logging.properties
  4. Put the new log4j 2 config file (log4j2.xml) in $CATALINA_HOME/lib

The trick is to follow the official tomcat 7 documentation to setup log4J 1.X but instead use log4j2 artifacts instead. Also this solution does not require any changes in $CATALINA_HOME/bin/catalina.sh or any other files $CATALINA_HOME/bin

like image 13
thorondor Avatar answered Oct 15 '22 12:10

thorondor


My mistake, I needed to include $CATALINA_BASE/lib in classpath for log4j2.xml to be picked up.

like image 6
Paramita Banerjee Avatar answered Oct 15 '22 12:10

Paramita Banerjee