Since I have been using log4j frequently recently, I have to create a logger object at the beginning of the class every time, so I wrote a log4j tool class.
package com.speedup.check.common; import java.io.PrintWriter; import java.io.StringWriter; import java.util.HashMap; import java.util.Map; import org.apache.log4j.Logger; /** * Log tool class * @author huwy * */ public class LogHelper { private static Map< String , Logger > loggerMap = new HashMap< String , Logger >(); public static void info( Object message ) { String className = getClassName(); Logger logger = getLogger( className ); logger.info( getLogPrefix() + message ); } /** * in the form of a placeholder * Example: info("tool class of %s", "log4j") == info("tool class of log4j") * @param message * @param args */ public static void info(Object message , Object ...args) { String className = getClassName(); Logger logger = getLogger( className ); logger.info( getLogPrefix() + String.format( message.toString() , args ) ); } public static void error( Exception e) { String className = getClassName(); Logger logger = getLogger( className ); logger.error( getLogPrefix() ,e ); } public static void error (Object message, Exception e) { String className = getClassName(); Logger logger = getLogger( className ); logger.error( message + getLogPrefix() + getLogExceInfo( e ) ); } /* * Get the class of the first caller */ private static String getClassName() { StackTraceElement [] stes = Thread.currentThread().getStackTrace(); StackTraceElement ste = stes [2]; return ste.getClassName(); } /** * Get log prefix */ private static String getLogPrefix () { String prefix = ""; StackTraceElement [] stacks = Thread.currentThread().getStackTrace(); prefix = stacks[3].getClassName() + "." + stacks[3].getMethodName() + ":[" + stacks[3].getLineNumber()+"]"; return prefix; } /** * Get exception log information */ private static String getLogExceInfo (Exception e) { StringWriter sw = new StringWriter(); e.printStackTrace( new PrintWriter( sw, true ) ); return sw.toString(); } /** * Get the logger object based on the class name * @param className * @return */ private static Logger getLogger(String className) { Logger logger = null; if (loggerMap.containsKey( className )) { logger = loggerMap.get( className ); } else { try { logger = Logger.getLogger (Class.forName (className)); loggerMap.put( className , logger ); } catch ( Exception e ) { e.printStackTrace (); } } return logger; } }
Example of calling:
public void uploadFile () { String date = DateHelper.getStr( new Date() , "yyyy-MM-dd" ); LogHelper.info("Date: %s started uploading files" , date); //file subdirectory path String filePath = DateHelper.getStr( new Date() , "yyyyMMdd" ); // get the file List< String > list = dataManager.getSoruceDataList( date ); //file name String fileName = bulidSoruceFileName( list ); //Create a file TxtManager.createFile( filePath , fileName); //construct file content String content = bulidSoruceContent( list ); // write content TxtManager.writeFile( filePath , fileName , content ); //Compressed file TxtManager.compressedFile( filePath , filePath , fileName); // get the file stream InputStream is = TxtManager.getFileInputStream( filePath , fileName ); //upload files FtpManager.uploadFile( is , filePath , fileName ); LogHelper.info( "Date: %s upload ended", date ); }
log4j configuration file
log4j.rootLogger = DEBUG, A1, A2 log4j.appender.A1 = org.apache.log4j.ConsoleAppender log4j.appender.A1.layout = org.apache.log4j.PatternLayout log4j.appender.A1.layout.ConversionPattern = %p %d{yyyy-MM-dd HH:mm:ss.SSS} %m%n log4j.appender.A2 = org.apache.log4j.DailyRollingFileAppender log4j.appender.A2.File = ${catalina.home}/logs/BusinessCheck/log.txt log4j.appender.A2.layout = org.apache.log4j.PatternLayout log4j.appender.A2.layout.ConversionPattern = %p %d{yyyy-MM-dd HH:mm:ss.SSS} %m%n