由于最近在做提使用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