首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

Log4j动态输出日记

2012-08-27 
Log4j动态输出日志项目中有这么一个需求,要求对要对指定包的所有下一级包的类进行日志隔离。如要对package1

Log4j动态输出日志
项目中有这么一个需求,要求对要对指定包的所有下一级包的类进行日志隔离。如要对package1的下级包进行日志隔离,然后有package1.subpackage1,package1.subpackage2........等包,需要将subpackage1下所有类(包括所有下级包的类)产生的日志输出到subpackage1.log文件中,subpackage2下的日志输出到subpackage2.log中。问过一些同事,也在网上问过一些朋友,最终找到了解决方案,重写一个Appender。所有代码如下:

DynamicWtriteLogAppender.javapackage com.xiaoyf.logerimport java.text.MessageFormat;import org.apache.log4j.Category;import org.apache.log4j.Logger;import org.apache.log4j.helpers.LogLog;import org.apache.log4j.spi.LocationInfo;import org.apache.log4j.spi.LoggingEvent;/** *  * @author xiaoYF * */public class DynamicWtriteLogAppender extends FileAppender{/** * 输出日志方式 */private int type = 0;/** * 设置日志输出方式 * @param type </br> *        <strong>0:</strong>将日志统一输出到以当前Logger的别名为文件名的文件中,</br> *          如配置为:log4j.category.package1 = info , package1,日志就都输出到package1.log中</br> *        <strong>1:</strong>按下级包分别输出么各自的文件中</br> *          如配置为:log4j.category.package1 = info , package1,</br> *          日志是由package1.subpackage1包下的类(包括下级包的类)产生的产生的,日志统一输出到</br> *          subpackage1.log中</br> *        <strong>2:</strong>按包输出日志,如配置为:log4j.category.package1 = info , package1,</br> *          日志是由package1.subpackage1.package1包下的类产生的产生的日志统一输出到package1.log中,</br> *          package1.subpackage1下包下的类产生的产生的日志统一输出到subpackage1.log中</br> *        <strong>3:</strong>按类输出日志,不同的类输出到以各自类名为文件名的日志文件中</br> */public void setType(int type){this.type = type;}public int getType(){return type;}private String outFileName;public String getOutFileName() {return outFileName;}public void setOutFileName(String outFileName) {this.outFileName = outFileName;}public DynamicWtriteLogAppender(){}private synchronized void apendLog(String fileName,LoggingEvent event)  {try {String oldFileName = this.getFile();super.setFile(fileName);super.activateOptions();super.subAppend(event);super.setFile(oldFileName);} catch (Exception e) {LogLog.error("append log error",e);}}protected void subAppend(LoggingEvent event) {String outPutTagFile = null;if(getType() == 0){outPutTagFile = getName();}else{String logName = event.getLoggerName();//日志名LocationInfo locationInfo = event.getLocationInformation();String className = null != locationInfo ? locationInfo.getClassName() : logName;String simpleClassName = className.substring(className.lastIndexOf(".")+1);if(getType() == 3){outPutTagFile = simpleClassName;}else{Category parentPogger = Logger.getLogger(logName).getParent();String parentLogName = null != parentPogger ? parentPogger.getName() : logName;//此 Logger 的父 logger名称String subPackage = className.replace(parentLogName, "").replaceFirst("\\.","");String[] packStructure = subPackage.split("\\.");int structLenth = packStructure.length;if(getType() == 1){outPutTagFile = structLenth > 1?packStructure[0]:null;}else{outPutTagFile = structLenth > 1?packStructure[structLenth-1]:null;}}}/** * 如果最后得到的日志输出目标名为null,日志输出到默认的文件中 */MessageFormat formatter = new MessageFormat(null == outPutTagFile?getFile():getOutFileName());apendLog(formatter.format(new String[]{outPutTagFile}),event);}}LOG4J配置文件 log4j.propertieslog4j.category.com.xiaoyf.plugin = info, pluginlog4j.additivity.com.seeyon.v3x.plugin = falselog4j.appender.plugin = com.xiaoyf.loger.DynamicWtriteLogAppenderlog4j.appender.plugin.outFileName = ${A8ApplicationRoot}/logs/{0}.loglog4j.appender.plugin.file = ${A8ApplicationRoot}/logs/plugin.loglog4j.appender.plugin.layout = org.apache.log4j.PatternLayoutlog4j.appender.plugin.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss} [%t] %5p %c{1}:%L - %m%nlog4j.appender.plugin.append = truelog4j.appender.plugin.type = 1
1 楼 laitaogood 2010-09-09   这个确实不错,哈哈

热点排行