日期:2014-05-20  浏览次数:20895 次

一个关于log4j的问题。
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.PatternLayout;
import org.apache.log4j.SimpleLayout;
import org.apache.log4j.FileAppender;

public class test1 {
static Logger logger = Logger.getLogger(test1.class);

public static void main(String args[]) {
for (int i = 0; i < 5; i++) {
generateReport(logger, i);
}
}

public static void generateReport(Logger log, int i) {
PatternLayout layout = new PatternLayout();
FileAppender appender = null;
try {
appender = new FileAppender(layout, "c:\\a\\output1.txt", true);
} catch (Exception e) {
}
logger.addAppender(appender);
logger.setLevel((Level) Level.INFO);
logger.info(">i<" + i);
logger.info("------------------");
}
}
这段代码我觉得应该输出如下:
>i<0
------------------
>i<1
------------------
>i<2
------------------
>i<3
------------------
>i<4
------------------

但是实际输出确实:
>i<0
------------------
>i<1
>i<1
------------------
------------------
>i<2
>i<2
>i<2
------------------
------------------
------------------
>i<3
>i<3
>i<3
>i<3
------------------
------------------
------------------
------------------
>i<4
>i<4
>i<4
>i<4
>i<4
------------------
------------------
------------------
------------------
------------------

请问原因,谢谢

------解决方案--------------------
LZ每循环一次,就会执行一次logger.addAppender(appender);
而后一次的add不会替换前一次的add,实际里面存的是一个AppenderList集合。
所以每循环一次就会多往output1.txt文件中写一次当前循环的日志。

------解决方案--------------------
楼上正解,appender会在Logger类中被持有,并不是用完一次就抛弃的。
------解决方案--------------------
Lz用的是logger.addAppender(appender);

用的是追加,肯定了,这个跟文件追加是一样的,肯定会把原来的带上