Create Custom Loger Using Log4J

Posted on the 18 March 2013 by Abhishek Somani @somaniabhi

Create Custom logger Using Log4J:

Sometimes , there are requirements to create separate log files based on some conditions , apart from root logger files . For Example, we want to log each logged in user's activity in its own separate file. So , user1 will have user1.log and each time if the user1 logged in to the system , his activity will be logged in user1.log also these log files will be created in the same folder as the root logger folder. This is a custom logger class , which will have the custom logger for every user id .In this class i have created a map which will have all the instances of custom logger , and based on the input userId , it will give the specific logger .If there is any exception creating logger , it will return root logger.We just have to call logMessage method along with the file name and message .
package com.util;

import java.io.File;
import java.util.Enumeration;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import org.apache.log4j.Appender;
import org.apache.log4j.FileAppender;
import org.apache.log4j.Layout;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;

/**
 * 
 * custom logger class to create separate logs based on user and each auction
 */
public class CustomLogger {
 private static Map m_loggers = new ConcurrentHashMap();
 private static String dir; // Root log directory
 private static Layout layout;
 private static Logger rootLogger = Logger.getRootLogger();

 public static synchronized void logMessage(String jobName, String message) {
  Logger l = getJobLogger(jobName);
  l.info(message);
 }

 /**
  * this is our custome logger which stores custome logger based on unique
  * name Like for each user it will have logger defined like
  * user_userId log files will be created in root logger directory
  * 
  * @param jobName
  * @return
  */
 private static Logger getJobLogger(String jobName) {
  Logger logger = m_loggers.get(jobName);
  if (dir == null || layout == null) {
   try {
    initialize();
   } catch (Exception e) {
    rootLogger.info("error getting file appender for custom logger");
    return rootLogger;
   }

  }

  if (logger == null) {
   logger = Logger.getLogger(jobName);
   m_loggers.put(jobName, logger);
   logger.setLevel(Level.INFO);
   try {
    File file = new File(dir);
    file.mkdirs();
    file = new File(dir, jobName + ".log");
    FileAppender appender = new FileAppender(layout,
      file.getAbsolutePath(), false);
    logger.removeAllAppenders();
    logger.addAppender(appender);
    rootLogger.info("file absolute path is "
      + file.getAbsolutePath());
   } catch (Exception e) {
       rootLogger.info("error getting custom logger , return root logger");
       logger = rootLogger;
   }
  }
  return logger;
 }

 private static void initialize() throws Exception {
  Enumeration enumeration = Logger.getRootLogger().getAllAppenders();
  while (enumeration.hasMoreElements()) {
     Appender app = (Appender) enumeration.nextElement();
         if (app instanceof FileAppender) {
      layout = app.getLayout();
      File f = new File(((FileAppender) app).getFile());
      dir = f.getParent();
   }
  }
  if (dir == null) {
   throw new Exception("dir is null ");
  }

 }
}
Post comments to make it more useful !!