Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How I could use an independent log4j instance in my vert.x application?

I'm developing a vert.x application. Specifically, I'm using Java + Eclipse + Maven + Vert.x. I read that JUL is the preferred logging framework and that vertx.log is saved under /tmp (I'm a linux user). Actually, I'd like to use log4j and generate different logging files under a custom logs folder. How can I do that? The vert.x documentation says (http://vertx.io/manual.html#logging):

If you don't want to use the Vert.x provided logging facilities that's fine. You can just use your preferred logging framework as normal and include the logging jar and config in your module.

So I've tried to include the log4j dependency into my pom.xml, copy the log4j.xml file in src/main/resources and define a logger variable in my Verticle class, but the console does not print anything... Where I'm doing wrong?

Thank you, Francesco

EDIT1: my pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>it.uniroma1.dis.wsngroup</groupId>
    <artifactId>wochat</artifactId>
    <packaging>jar</packaging>
    <version>1.0-SNAPSHOT</version>
    <name>WoChat</name>

    <parent>
         <groupId>org.sonatype.oss</groupId>
         <artifactId>oss-parent</artifactId>
         <version>7</version>
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

        <!-- Set pullInDeps to true if you want any modules specified in the 'includes' and 'deploys' fields
        in your mod.json to be automatically pulled in during packaging and added inside your module. Doing this means your
        module won't download and install those dependencies at run-time when they're first requested. -->
        <vertx.pullInDeps>false</vertx.pullInDeps>

        <!-- Set createFatJar to true if you want to create a fat executable jar which contains the Vert.x binaries
        along with the module so it can be run with java -jar <jarname> -->
        <vertx.createFatJar>false</vertx.createFatJar>

        <!--Vertx module name-->
        <module.name>${project.groupId}~${project.artifactId}~${project.version}</module.name>

        <!-- The directory where the module will be assembled - you can override this on the command line
        with -Dmods.directory=mydir -->
        <mods.directory>target/mods</mods.directory>

        <!--Dependency versions-->
        <vertx.version>2.1M1</vertx.version>
        <vertx.testtools.version>2.0.2-final</vertx.testtools.version>
        <junit.version>4.11</junit.version>

        <!--Plugin versions-->
        <maven.compiler.plugin.version>3.0</maven.compiler.plugin.version>
        <maven.resources.plugin.version>2.6</maven.resources.plugin.version>
        <maven.clean.plugin.version>2.5</maven.clean.plugin.version>
        <maven.vertx.plugin.version>2.0.1-final</maven.vertx.plugin.version>
        <maven.surefire.plugin.version>2.14</maven.surefire.plugin.version>
        <maven.failsafe.plugin.version>2.14</maven.failsafe.plugin.version>
        <maven.surefire.report.plugin.version>2.14</maven.surefire.report.plugin.version>
        <maven.javadoc.plugin.version>2.9</maven.javadoc.plugin.version>
        <maven.dependency.plugin.version>2.7</maven.dependency.plugin.version>
    </properties>

    <repositories>
        <repository>
            <id>sonatype-nexus-snapshots</id>
            <url>https://oss.sonatype.org/content/repositories/snapshots</url>
        </repository>
    </repositories>

    <dependencies>
        <!--Vertx provided dependencies-->
        <dependency>
            <groupId>io.vertx</groupId>
            <artifactId>vertx-core</artifactId>
            <version>${vertx.version}</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>io.vertx</groupId>
            <artifactId>vertx-platform</artifactId>
            <version>${vertx.version}</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>io.vertx</groupId>
            <artifactId>vertx-hazelcast</artifactId>
            <version>${vertx.version}</version>
            <scope>provided</scope>
        </dependency>
        <!--Test dependencies-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>io.vertx</groupId>
            <artifactId>testtools</artifactId>
            <version>${vertx.testtools.version}</version>
            <scope>test</scope>
        </dependency>

        <!-- Add any other dependencies that you want packaged into your module (in the lib dir) here
        as 'compile' dependencies. Here is an example
        <dependency>
            <groupId>org.hamcrest</groupId>
            <artifactId>hamcrest-core</artifactId>
            <version>1.3</version>
            <scope>compile</scope>
        </dependency>
        -->

    </dependencies>

    <build>
        <plugins>

            <!-- The vert.x Maven plugin -->
            <plugin>
                <groupId>io.vertx</groupId>
                <artifactId>vertx-maven-plugin</artifactId>
                <version>${maven.vertx.plugin.version}</version>
                <!--
                You can specify extra config to the plugin as required here
                <configuration>
                     <configFile>/path/to/MyVerticle.conf</configFile>
                     <instances>1</instances>
                     <classpath>src/main/resources/:src/test/resources/:target/classes/:target/test-classes/</classpath>
                </configuration>
                -->
                <executions>
                    <execution>
                        <id>PullInDeps</id>
                        <phase>prepare-package</phase>
                        <goals>
                            <goal>pullInDeps</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

            <!-- Other plugins required by the build -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>${maven.compiler.plugin.version}</version>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-resources-plugin</artifactId>
                <version>${maven.resources.plugin.version}</version>
                <executions>
                    <execution>
                        <id>copy-mod-to-target</id>
                        <phase>process-classes</phase>
                        <goals>
                            <goal>copy-resources</goal>
                        </goals>
                        <configuration>
                            <overwrite>true</overwrite>
                            <outputDirectory>${mods.directory}/${module.name}</outputDirectory>
                            <resources>
                                <resource>
                                    <directory>target/classes</directory>
                                </resource>
                            </resources>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <version>${maven.dependency.plugin.version}</version>
                <executions>
                    <execution>
                        <id>copy-mod-dependencies-to-target</id>
                        <phase>process-classes</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${mods.directory}/${module.name}/lib</outputDirectory>
                            <includeScope>runtime</includeScope>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>${maven.surefire.plugin.version}</version>
                <configuration>
                    <includes>
                        <include>**/unit/*Test*.java</include>
                    </includes>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-failsafe-plugin</artifactId>
                <version>${maven.failsafe.plugin.version}</version>
                <configuration>
                    <systemProperties>
                        <property>
                            <name>vertx.mods</name>
                            <value>${mods.directory}</value>
                        </property>
                    </systemProperties>
                    <includes>
                        <include>**/integration/**</include>
                    </includes>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>integration-test</goal>
                            <goal>verify</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-report-plugin</artifactId>
                <version>${maven.surefire.report.plugin.version}</version>
                <executions>
                    <execution>
                        <id>generate-test-report</id>
                        <phase>test</phase>
                        <goals>
                            <goal>report-only</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>generate-integration-test-report</id>
                        <phase>integration-test</phase>
                        <goals>
                            <goal>failsafe-report-only</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <descriptors>
                        <descriptor>src/main/assembly/mod.xml</descriptor>
                    </descriptors>
                </configuration>
                <executions>
                    <execution>
                        <id>assemble</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
        <pluginManagement>
            <plugins>
                <!--This plugin's configuration is used to store Eclipse m2e settings 
                    only. It has no influence on the Maven build itself.
                    http://stackoverflow.com/questions/8706017/maven-dependency-plugin-goals-copy-dependencies-unpack-is-not-supported-b
                -->
                <plugin>
                    <groupId>org.eclipse.m2e</groupId>
                    <artifactId>lifecycle-mapping</artifactId>
                    <version>1.0.0</version>
                    <configuration>
                        <lifecycleMappingMetadata>
                            <pluginExecutions>
                                <pluginExecution>
                                    <pluginExecutionFilter>
                                        <groupId>
                                            org.apache.maven.plugins
                                        </groupId>
                                        <artifactId>
                                            maven-dependency-plugin
                                        </artifactId>
                                        <versionRange>[2.7,)</versionRange>
                                        <goals>
                                            <goal>copy-dependencies</goal>
                                        </goals>
                                    </pluginExecutionFilter>
                                    <action>
                                        <ignore></ignore>
                                    </action>
                                </pluginExecution>
                            </pluginExecutions>
                        </lifecycleMappingMetadata>
                    </configuration>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>
    <reporting>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-report-plugin</artifactId>
                <version>${maven.surefire.report.plugin.version}</version>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-javadoc-plugin</artifactId>
                <version>${maven.javadoc.plugin.version}</version>
                <configuration>
                    <aggregate>true</aggregate>
                </configuration>
            </plugin>
        </plugins>
    </reporting>
</project>

EDIT2: my log4j.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'>
    <appender name="Console" class="org.apache.log4j.ConsoleAppender">
    <param name="Threshold" value="DEBUG"/>
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d %-5p [%F:%L] - %m%n" />
    </layout>
    </appender>

    <appender name="Generic_File" class="org.apache.log4j.DailyRollingFileAppender">
    <param name="File" value="logs/wochat.log"/>
    <param name="Threshold" value="DEBUG"/>
    <param name="Append" value="true"/>
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d %-5p [%F:%L] - %m%n" />
    </layout>
    </appender>

    <appender name="Interactions_Log_File" class="org.apache.log4j.DailyRollingFileAppender">
    <param name="File" value="logs/interactions.log"/>
    <param name="Threshold" value="INFO"/>
    <param name="Append" value="true"/>
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%m%n" />
    </layout>
    </appender>

    <appender name="Messages_Log_File" class="org.apache.log4j.DailyRollingFileAppender">
    <param name="File" value="logs/messages.log"/>
    <param name="Threshold" value="INFO"/>
    <param name="Append" value="true"/>
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%m%n" />
    </layout>
    </appender>

    <logger name="it.uniroma1.dis.wsngroup.wochat.logging.LogInteraction" additivity="false">
    <level value="INFO" />
    <appender-ref ref="Interactions_Log_File" />
    </logger>

    <logger name="it.uniroma1.dis.wsngroup.wochat.logging.LogMessage" additivity="false">
    <level value="INFO" />
    <appender-ref ref="Messages_Log_File" />
    </logger>

    <root>
    <level value="DEBUG" />
    <appender-ref ref="Console" />
    <appender-ref ref="Generic_File" />
    </root>
</log4j:configuration>
like image 946
f_ficarola Avatar asked Jan 04 '14 23:01

f_ficarola


2 Answers

Here the official topic: https://groups.google.com/forum/#!topic/vertx/xhA9Gze1LM4

The author is investigating why it doesn't work. In the meantime he suggests to use:

-Dlog4j.configuration=file:./your_path/log4j.xml
like image 157
f_ficarola Avatar answered Sep 23 '22 01:09

f_ficarola


The manual also explains how you need to set a system property in the vertx.sh script. So, for log4j:

-Dorg.vertx.logger-delegate-factory-class-name=org.vertx.java.core.logging.impl.Log4jLogDelegateFactory

That should ensure that Vert.x's logging goes through log4j and picks up your configuration.

(Similarly, there's an SLF4JLogDelegateFactory implementation, which may be a better choice if you're writing code you may reuse in other contexts.)

like image 22
Joe Avatar answered Sep 19 '22 01:09

Joe