由于最近在做提使用log4j频繁,每次都要在类的开头都要创建logger对象,于是写了一个log4j工具类。
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; /** * 日志工具类 * @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 ); } /** * 占位符的形式 * 示例:info("%s的工具类", "log4j") == info("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 ) ); } /* * 获取最开始的调用者所在类 */ private static String getClassName() { StackTraceElement [] stes = Thread.currentThread().getStackTrace(); StackTraceElement ste = stes[2]; return ste.getClassName(); } /** * 获取日志前缀 */ private static String getLogPrefix () { String prefix = ""; StackTraceElement [] stacks = Thread.currentThread().getStackTrace(); prefix = stacks[3].getClassName() + "." + stacks[3].getMethodName() + ":[" + stacks[3].getLineNumber()+"]"; return prefix; } /** * 获取异常日志信息 */ private static String getLogExceInfo (Exception e) { StringWriter sw = new StringWriter(); e.printStackTrace( new PrintWriter( sw, true ) ); return sw.toString(); } /** * 根据类名获取logger对象 * @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; } }
调用示例:
public void uploadFile () { String date = DateHelper.getStr( new Date() , "yyyy-MM-dd" ); LogHelper.info("日期:%s开始上传文件" , date); //文件子目录路径 String filePath = DateHelper.getStr( new Date() , "yyyyMMdd" ); //获取文件 List< String > list = dataManager.getSoruceDataList( date ); //文件名 String fileName = bulidSoruceFileName( list ); //创建文件 TxtManager.createFile( filePath , fileName); //构造文件内容 String content = bulidSoruceContent( list ); //写入内容 TxtManager.writeFile( filePath , fileName , content ); //压缩文件 TxtManager.compressedFile( filePath , filePath , fileName); //获取文件流 InputStream is = TxtManager.getFileInputStream( filePath , fileName ); //上传文件 FtpManager.uploadFile( is , filePath , fileName ); LogHelper.info( "日期:%s上传结束", date ); }
log4j配置文件
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