Wildfly 10 Logging Service

In this post, I will demonstrate how to configure logging for specific application. Logging is very crucial thing to help to diagnose the status of your application. Wildfly integrate logging system come with the configuration. To configure logging service for particular application, you need to edit standalone.xml configuration file, find <subsystem xmlns="urn:jboss:domain:logging:3.0">  and add below.

Configuring standalone.xml file

You need to go to your standalone.xml and add as below to the end of file.
<logging-profiles>  
  <logging-profile name="concurrency.apps">  
  <console-handler name="CONSOLE-1">
    <level name="INFO"/>
    <formatter>
        <named-formatter name="COLOR-PATTERN-1"/>
    </formatter>
  </console-handler>
  <size-rotating-file-handler name="FILE-1" autoflush="true">
   <level name="INFO"/>
   <formatter>
        <named-formatter name="PATTERN-1"/>
   </formatter>
   <file relative-to="jboss.server.log.dir" path="concurrency.apps.log"/>
  <append value="true"/>
  </size-rotating-file-handler>
  <logger category="pro.itstikk" use-parent-handlers="false">
   <level name="INFO"/>
   <handlers>
      <handler name="FILE-1"/>
      <handler name="CONSOLE-1"/>
   </handlers>
  </logger>
  <formatter name="COLOR-PATTERN-1">
    <pattern-formatter pattern="%K{level}%d{HH:mm:ss,SSS} %-5p [%c] (%t) %s%e%n"/>
  </formatter>
  <formatter name="PATTERN-1">
    <pattern-formatter pattern="%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p [%c] (%t) %s%e%n"/>
  </formatter>
  <root-logger>
    <level name="INFO"/>
    <handlers>
        <handler name="CONSOLE-1"/>
        <handler name="FILE-1"/>
    </handlers>
  </root-logger>
  </logging-profile>  
</logging-profiles>

Create Class to test 

To test the logging configuration service, you just create a simple project

package pro.itstikk.wildfly;

import java.util.logging.Level;
import java.util.logging.Logger;

public class SampleTask implements Runnable {
private static Logger logger = Logger.getLogger(SampleTask.class.getName());
@Override
public void run() {
while (true) {
logger.log(Level.INFO, "New thread running...");
try {
logger.log(Level.INFO,"------- Hello World --------");
Thread.sleep(5000);
} catch (InterruptedException e) {
logger.log(Level.SEVERE, "Thread interrupted", e);
}
}
}

}


Create class to run the thread
package pro.itstikk.wildfly;

import javax.annotation.Resource;
import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import javax.enterprise.concurrent.ManagedThreadFactory;

/**
 * Session Bean implementation class SampleBean
 */
@Stateless(mappedName = "sampleBean")
@LocalBean
public class SampleBean {

    /**
     * Default constructor. 
     */
    @Resource(lookup="java:jboss/ee/concurrency/factory/MyManagedThreadFactory")
    private ManagedThreadFactory threadFactory;
    public SampleBean() {
        super();
    }
    
    public void runReports() {
        SampleTask sampleTask = new SampleTask();
        Thread thread = threadFactory.newThread(sampleTask);
        thread.start();
    }
}

To run this program you need to add some configuration in the standalone.xml
<subsystem xmlns="urn:jboss:domain:ee:4.0">
    <spec-descriptor-property-replacement>false</spec-descriptor-property-replacement>
    <concurrent>
        <context-services>
            <context-service name="default" jndi-name="java:jboss/ee/concurrency/context/default" use-transaction-setup-provider="true"/>
        </context-services>
        <managed-thread-factories>
            <managed-thread-factory name="default" jndi-name="java:jboss/ee/concurrency/factory/default" context-service="default"/>
            <managed-thread-factory name="myManagedThreadFactory" jndi-name="java:jboss/ee/concurrency/factory/MyManagedThreadFactory" context-service="default" priority="1"/>
        </managed-thread-factories>
        <managed-executor-services>
            <managed-executor-service name="default" jndi-name="java:jboss/ee/concurrency/executor/default" context-service="default" hung-task-threshold="60000" keepalive-time="5000"/>
        </managed-executor-services>
        <managed-scheduled-executor-services>
            <managed-scheduled-executor-service name="default" jndi-name="java:jboss/ee/concurrency/scheduler/default" context-service="default" hung-task-threshold="60000" keepalive-time="3000"/>
        </managed-scheduled-executor-services>
    </concurrent>
    <default-bindings context-service="java:jboss/ee/concurrency/context/default" datasource="java:jboss/datasources/ExampleDS" jms-connection-factory="java:jboss/DefaultJMSConnectionFactory" managed-executor-service="java:jboss/ee/concurrency/executor/default" managed-scheduled-executor-service="java:jboss/ee/concurrency/scheduler/default" managed-thread-factory="java:jboss/ee/concurrency/factory/default"/>
</subsystem>

Finally, you need to edit MANIFET.MF in the META-INF folder.
Manifest-Version: 1.0
Class-Path: 
Logging-Profile: concurrency.apps
the name must be must with the logging-profile name in the standalone.xml file.

Fig 01 Edit MANIFEST.MF file

After running the program, you could get as below. you could execute program in ServletContextListener
15:19:27,649 INFO  [pro.itstikk.wildfly.SampleTask] (EE-ManagedThreadFactory-myManagedThreadFactory-Thread-1) ------- Hello World --------
15:19:32,651 INFO  [pro.itstikk.wildfly.SampleTask] (EE-ManagedThreadFactory-myManagedThreadFactory-Thread-1) New thread running...
15:19:32,653 INFO  [pro.itstikk.wildfly.SampleTask] (EE-ManagedThreadFactory-myManagedThreadFactory-Thread-1) ------- Hello World --------
15:19:37,654 INFO  [pro.itstikk.wildfly.SampleTask] (EE-ManagedThreadFactory-myManagedThreadFactory-Thread-1) New thread running...
15:19:37,654 INFO  [pro.itstikk.wildfly.SampleTask] (EE-ManagedThreadFactory-myManagedThreadFactory-Thread-1) ------- Hello World --------
15:19:42,655 INFO  [pro.itstikk.wildfly.SampleTask] (EE-ManagedThreadFactory-myManagedThreadFactory-Thread-1) New thread running...
15:19:42,655 INFO  [pro.itstikk.wildfly.SampleTask] (EE-ManagedThreadFactory-myManagedThreadFactory-Thread-1) ------- Hello World --------

For the log file, it will be generated under $JBOSS_HOME/standalone/log folder as you have specified in the configuration.

Checking Generated Log File

In case you convert your project to maven project, you need to configure logging profile your pom.xml file

 <plugin>
<artifactid>maven-war-plugin</artifactid>
<version>3.0.0</version>
<configuration>
<warsourcedirectory>webapps</warsourcedirectory>
<archive>
<manifestentries>
<Logging-Profile>concurrency.apps</Logging-Profile>
</manifestentries>
</archive>

</configuration>
</plugin>

Integrate Log4j logging service

integrate EJB with log4j is very simple.  Just create log4j.xml or log4j.properites in META-INF. And add log4j dependency to pom.xml.

<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>
Then create log4j.xml in META-INFO
<?xml version="1.0" encoding="UTF-8"?>
<log4j:configuration debug="true"
                     xmlns:log4j='http://jakarta.apache.org/log4j/'>
    <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{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n" />
    </layout>
</appender>
    <appender name="fileAppender" class="org.apache.log4j.RollingFileAppender">
        <param name="append" value="false" />
        <param name="file" value="${jboss.server.log.dir}/application.log" />
 
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%c{1}] %m%n" />
        </layout>
    </appender>
 
    <root>
        <level value="INFO" />
        <appender-ref ref="console" />
        <appender-ref ref="fileAppender" />
    </root>
 
</log4j:configuration>

Fig 03. log4j.xml



Then creata EJB class as below.

package pro.itstikk.java.ee;

import javax.ejb.LocalBean;
import javax.ejb.Schedule;
import javax.ejb.Singleton;

import org.apache.log4j.Logger;



/**
* Session Bean implementation class MainApp
*/
@Singleton
@LocalBean
public class MainApp {

   private static Logger logger = Logger.getLogger(MainApp.class);

   /**
    * Default constructor.
    */
   public MainApp() {
   // TODO Auto-generated constructor stub
   }
   @Schedule(second="*/10",minute="*",hour="*")
   public void run() {
       logger.debug("hello world");
   }

}
After execute program, application.log should be create as below.

No comments:

Post a Comment

Feature Recently

Running Wildfly Application Server in Domain Mode

  Wildfly application server provides two modes of how to run application one wildfly application server. It is very simple if you run your ...

Most Views