7

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>
redcrow
  • 1,743
  • 3
  • 25
  • 45
  • Post your `log4j.xml` – Elliott Frisch Jan 04 '14 at 23:36
  • Done, thank you. At present I've deleted the log4j dependency because eclipse can include it without errors (probably it's included in the vert.x dependency). – redcrow Jan 04 '14 at 23:43
  • I actually asked for the "log4j.xml" not the "pom", but thanks! – Elliott Frisch Jan 04 '14 at 23:45
  • Ups, I'm sorry. I read "xml" and I confused the two files. Done, thank you again! – redcrow Jan 04 '14 at 23:54
  • JUL is not the preferred logging solution. Please read: http://stackoverflow.com/questions/11359187/dont-get-it-why-not-jul – Software Engineer Jan 05 '14 at 00:18
  • Indeed I don't want to use JUL, but log4j. Unfortunately vert.x uses JUL as preferred logging framework. Please read: http://vertx.io/manual.html#logging and http://vertx.io/core_manual_java.html#logging-from-a-verticle – redcrow Jan 05 '14 at 00:35
  • 1
    I'm continuing to try all solutions that come to my mind, and I've even discovered that no vertx.log file is created (as described in the manual...). – redcrow Jan 05 '14 at 20:02
  • I am also struggling with logging: http://stackoverflow.com/questions/33544533/vertx-clustered-mode-hazelcast-log-config-on-linux – rupweb Nov 06 '15 at 11:32

2 Answers2

3

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
redcrow
  • 1,743
  • 3
  • 25
  • 45
1

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.)

Joe
  • 29,416
  • 12
  • 68
  • 88
  • The problem is that I don't have a vertx.sh because I'm using Maven, not a standalone installation of vert.x. So, I already tried to run the Verticle as "mvn vertx:runMod -D...", but it didn't work. – redcrow Jan 05 '14 at 14:02
  • [This post on the mailing list](https://groups.google.com/d/msg/vertx/XeYqrKLRg9M/PXX29zREoLQJ) suggests `MAVEN_OPTS="-Dorg.vertx.logger-delegate-factory-class-name=xxx" mvn vertx:runMod`. – Joe Jan 06 '14 at 09:52
  • Yes, I also tried that solution, but didn't work. It looks like it doesn't load any logger. The application starts, but the logger doesn't work. – redcrow Jan 06 '14 at 14:31
  • Same problem with SLF4J. But in this case the application outputs the following message `SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".` Anyway, the correct way to load a different logger (even if the logger doesn't print anything) seems to be `mvn vertx:runMod -Drg.vertx.logger-delegate-factory-class-name=xxx`. By using `MAVEN_OPTS` the app throws an exception. – redcrow Jan 06 '14 at 14:40