Log4j动态输出日志

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


DynamicWtriteLogAppender.java

package com.xiaoyf.loger
import 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.properties

log4j.category.com.xiaoyf.plugin = info, plugin
log4j.additivity.com.seeyon.v3x.plugin = false

log4j.appender.plugin = com.xiaoyf.loger.DynamicWtriteLogAppender
log4j.appender.plugin.outFileName = ${A8ApplicationRoot}/logs/{0}.log
log4j.appender.plugin.file = ${A8ApplicationRoot}/logs/plugin.log
log4j.appender.plugin.layout = org.apache.log4j.PatternLayout
log4j.appender.plugin.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss} [%t] %5p %c{1}:%L - %m%n
log4j.appender.plugin.append = true
log4j.appender.plugin.type = 1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值