Log4j Tutorial

Log4j is a reliable, fast and flexible logging framework (APIs) written in Java, which is distributed under the Apache Software License.

log4j Features: 

It is thread-safe.
It supports multiple output appenders per logger.  
It uses multiple levels, namely ALL, TRACE, DEBUG, INFO, WARN, ERROR and FATAL. 


Log4j provide different type of appender to manage logs.

Mainly used appender is :-
  1. ConsoleAppender
  2. FileAppender
  3. JDBCAppender
  4. SocketAppender   
     etc...




Log4j , In Servlet Program.

Step 1 :  Use log4j.jar file in lib folder of project and Create log4j.properties file and define which type of logs you want. we are showing here ConsoleAppender, FileAppender logs.


# Root logger option
log4j.rootLogger=DEBUG, stdout, file

# Direct log messages to stdout ConsoleAppender
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

# File log appender
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=/var/www/html/techa2zsolution.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%-7p %d [%t] %c %x - %m%n

Step 2 : In servlet first you load log4j.properties file at the time of server start-up that's why we are loading through ServletContextListener interface by declare web.xml context-param

    <context-param>
        <param-name>log4j-config-location</param-name>
        <param-value>WEB-INF/log4j.properties</param-value>
    </context-param>

 To load log4j.properties file create ContextListener class which is loaded at start-up

public class ContextListener implements ServletContextListener {

    /**
     * Initialize log4j when the application is being started
     */
    @Override
    public void contextInitialized(ServletContextEvent event) {
        // initialize log4j here
        ServletContext context = event.getServletContext();
        String log4jConfigFile = context.getInitParameter("log4j-config-location");
        String fullPath = context.getRealPath("") + File.separator + log4jConfigFile;
        PropertyConfigurator.configure(fullPath);
       
    }
   
    @Override
    public void contextDestroyed(ServletContextEvent event) {
        // do nothing
    }
}

For loading this listener class listener xml tags are declared in web.xml file. just like servlet-class mapping.



<listener>
        <listener-class>com.techa2zsolution.log4j.ContextListener</listener-class>
    </listener>

Now main configuration of log4j is completed. When you use another framework this listener class not need to make, like spring framework, struts etc, it's provide listener class in own jar file (org.springframework.web.util.Log4jConfigListener).

How It is used..

public class Log4jAction extends HttpServlet {
    final static Logger logger = Logger.getLogger(Log4jAction.class);
   
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        logger.info("This is a logging statement from log4j");
        String html = "<html><h2>Log4j has been initialized successfully!</h2></html>";
        resp.getWriter().println(html);
    }
}

define servlet mapping in web.xml.

<servlet>
        <servlet-name>log4j</servlet-name>
        <servlet-class>com.techa2zsolution.log4j.Log4jAction</servlet-class></servlet>
<servlet-mapping>
        <servlet-name>log4j</servlet-name>
        <url-pattern>/loggerProgram</url-pattern>
</servlet-mapping>


JDBCAppender : 

The log4j API provides the org.apache.log4j.jdbc.JDBCAppender to manage logs through database.

  • Before going to logging in database, create table to manage database information using sql querys.      
    CREATE TABLE LOG
       (USER_ID VARCHAR(20)    NOT NULL,
        DATED   DATE           NOT NULL,
        LOGGER  VARCHAR(50)    NOT NULL,
        LEVEL   VARCHAR(10)    NOT NULL,
        MESSAGE VARCHAR(1000)  NOT NULL
       ); 
  • # Define the DB appender
    log4j.appender.DB=org.apache.log4j.jdbc.JDBCAppender
    # Set JDBC URL
    log4j.appender.DB.URL=jdbc:mysql://localhost:3306/techa2zsolution
    # Set Database Driver
    log4j.appender.DB.driver=com.mysql.jdbc.Driver
    # Set database user name and password
    log4j.appender.DB.user=root
    log4j.appender.DB.password=root
    # Set the SQL statement to be executed.
    log4j.appender.DB.sql=INSERT INTO LOG VALUES('%x','%d{yyyy-MM-dd}','%C','%p','%m')
    # Define the layout for file appender
    log4j.appender.DB.layout=org.apache.log4j.PatternLayout
Now use as per above configuration.