Spring MVC + Log4j integration example

spring-log4j

In this tutorial, we will show you how to integrate the log4j framework with the Spring MVC web application.

All you need to do is :

  1. Include the log4j.jar as the project dependency.
  2. Create a log4j.properties file and put it into the root of the classpath (for Maven, put it into the resources folder).

Technologies and tools used :

  1. Log4j 1.2.17
  2. Spring 4.0.5.RELEASE
  3. Maven 3
  4. Tomcat 6
  5. Eclipse Kepler 4.3
Note
By default, Spring is using the JCL dependency (commons-logging), and it has a runtime discovery algorithm to find out for other logging frameworks in well known places on the project classpath.

1. Project Directory

Review the final project structure.

spring-mvc-log4j-directory

2. Project Dependencies

Declares the following dependencies :

pom.xml
	<properties>
		<spring.version>4.0.5.RELEASE</spring.version>
		<log4j.version>1.2.17</log4j.version>
		<jstl.version>1.2</jstl.version>
	</properties>
 
	<dependencies>
 
		<!-- Spring framework -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
			<version>${spring.version}</version>
		</dependency>
 
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>${spring.version}</version>
		</dependency>
 
		<!-- Log4j -->
		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>${log4j.version}</version>
		</dependency>
 
		<!-- jstl , for JSP, optional -->
		<dependency>
			<groupId>jstl</groupId>
			<artifactId>jstl</artifactId>
			<version>${jstl.version}</version>
		</dependency>
 
	</dependencies>

3. log4j.properties

Create a log4j properties file, and put it into the resources folder, refer to step #1.

log4j.properties
# Root logger option
log4j.rootLogger=DEBUG, stdout, file
 
# Redirect log messages to console
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
 
# Redirect log messages to a log file
log4j.appender.file=org.apache.log4j.RollingFileAppender
#outputs to Tomcat home
log4j.appender.file.File=${catalina.home}/logs/myapp.log
log4j.appender.file.MaxFileSize=5MB
log4j.appender.file.MaxBackupIndex=10
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

4. Spring MVC Controller + Message Logging

A simple controller to return a welcome page. Furthermore, it shows you how to use log4j to do the message logging.

WelcomeController.java
package com.mkyong.common.controller;
 
import org.apache.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
 
@Controller
public class WelcomeController {
 
	private static final Logger logger = Logger.getLogger(WelcomeController.class);
 
	@RequestMapping(value = "/", method = RequestMethod.GET)
	public ModelAndView getWelcome() {
 
		//logs debug message
		if(logger.isDebugEnabled()){
			logger.debug("getWelcome is executed!");
		}
 
		//logs exception
		logger.error("This is Error message", new Exception("Testing"));
 
		ModelAndView model = new ModelAndView("welcome");
		model.addObject("msg", "Hello Spring MVC + Log4j");
		return model;
 
	}
 
}

5. Demo

Run the web application, and access the welcome controller.

5.1 All logging messages will be displayed in the console.

log4j.properties
# Redirect log messages to console
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
Eclipse console
Jul 03, 2014 7:19:31 PM org.apache.jk.server.JkMain start
INFO: Jk running ID=0 time=0/11  config=null
Jul 03, 2014 7:19:31 PM org.apache.catalina.startup.Catalina start
INFO: Server startup in 1162 ms
2014-07-03 19:19:43 ERROR WelcomeController:23 - This is Error message
java.lang.Exception: Testing
	at com.mkyong.common.controller.WelcomeController.getWelcome(WelcomeController.java:23)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)

5.2 Furthermore, a logging file is created in the Tomcat’s logs folder.

log4j.properties
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=${catalina.home}/logs/myapp.log
log4j.appender.file.MaxFileSize=5MB
log4j.appender.file.MaxBackupIndex=10
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
D:\apache-tomcat-6.0.37\logs\myapp.log
Jul 03, 2014 7:19:31 PM org.apache.jk.server.JkMain start
INFO: Jk running ID=0 time=0/11  config=null
Jul 03, 2014 7:19:31 PM org.apache.catalina.startup.Catalina start
INFO: Server startup in 1162 ms
2014-07-03 19:19:43 ERROR WelcomeController:23 - This is Error message
java.lang.Exception: Testing
	at com.mkyong.common.controller.WelcomeController.getWelcome(WelcomeController.java:23)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
spring-mvc-log4j-file

Download Source Code

Download it – Log4j-SpringMVC-Example.zip (11 KB)

References

  1. Spring Reference – Using log4j
  2. log4j 1.2 official page
  3. log4j hello world example
  4. log4j.properties examples
Tags :

About the Author

mkyong
Founder of Mkyong.com and HostingCompass.com, love Java and open source stuff. Follow him on Twitter, or befriend him on Facebook or Google Plus. If you like my tutorials, consider make a donation to these charities.

Comments

  • Krunal Jain

    We also need to include following –

    log4jConfigLocation
    /WEB-INF/resource/log4j.properties

    org.springframework.web.util.Log4jConfigListener

    in your “web.xml”. Then, it will work fine with your properties file.

  • http://winanipad3x.com/ http://winanipad3x.com

    Will you be capable of manual us in your web marketer or the person that takes care of your blog post, I have to determine if it will be easy to certainly be a invitee poster.

  • BJacob

    This is not any different from configuring log4j in any java program. Can it be configured as a bean in application context and inject the parameters/properties?

  • pejot

    hi,

    great article, as always.

    Shouldn’t there be

    LoggerFactory.getLogger() ?

    Cheers,
    pejot

  • Hithredin

    Hi!
    When I implement this solution it give me a Grave warning when I stop Tomcat:
    “A Local Thread has been created”

    I guess it comes from the initialisation’s method of the logger:
    private static final Logger logger = Logger.getLogger(WelcomeController.class);

  • Jan

    Thanks!

  • Bader

    Nice Explanation but you should also explain the process of adding dependencies for the beginners like me.
    Anyways It worked for me.. Cheers ;)

  • parimala

    this is not working for me..

    getting the following error.

    log4j:WARN No appenders could be found for logger (…).
    log4j:WARN Please initialize the log4j system properly.

    • Arokiadoss

      keep the log4j.properties directly under WEB-INF/classes folder(inside the war), then it should work.

  • Richard

    This is exactly what I’ve been looking for!

    Thanks!