在Lab6中,我们同时执行多个Monkey线程,并需要为每一个Monkey生成独立的日志文件
但是在实验过程中虽然生成了对应的日志文件,但是文件的内容并不是独立关于一只猴子的,而是许多内容基本相同的文件
想要实现独立的日志,要进行如下操作:
在一个项目里,我使用Log4j生成日志,我不希望任务线程组各个线程都记录在同一个日志里,那样太乱了,而是单独生成日志记录。这样的话,需要针对每个线程创建Logger实例,实例名应对应线程名,而每个Logger实例的文件名应分别对应于实例名或者线程名。
自定义Appenderpackage threadlogger.appender;
import java.io.File;
import java.io.IOException;
import org.apache.log4j.DailyRollingFileAppender;
import org.apache.log4j.Layout;
public class ThreadSeperateDailyRollingFileAppender extends
DailyRollingFileAppender
{
public ThreadSeperateDailyRollingFileAppender() {}
public ThreadSeperateDailyRollingFileAppender(Layout layout, String datePattern) throws IOException
{
super(layout,
"log" + File.separator + Thread.currentThread().getName(),
datePattern);
}
}
封装获得线程独立日志的Logger实例的类:
import java.io.IOException;
import org.apache.log4j.ConsoleAppender;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.PatternLayout;
import threadlogger.appender.ThreadSeperateDailyRollingFileAppender;
public class ThreadLogger
{
ThreadLogger() {};
public static Logger getLogger()
{
Logger logger = null;
// 创建一个Logger实例, 就以线程名命名
logger = Logger.getLogger(Thread.currentThread().getName());
PatternLayout layout = new PatternLayout("%-4r %-5p [%d{yyyy-MM-dd HH:mm:ss,SSS}] %l%t: %m%n");
// 控制台输出
ConsoleAppender concoleAppender = new ConsoleAppender(layout, "System.out");
// 文件输出
ThreadSeperateDailyRollingFileAppender R = null;
try
{
R = new ThreadSeperateDailyRollingFileAppender(layout, "'.'yyyy-MM-dd'.log'");
}
catch (IOException e)
{
e.printStackTrace();
}
// 参数配置, 因为没有找到仅靠配置文件的办法, 只好放在这里设
R.setAppend(false);
R.setImmediateFlush(true);
R.setThreshold(Level.WARN);
// 绑定到Logger
logger.setLevel(Level.DEBUG);
logger.addAppender(concoleAppender);
logger.addAppender(R);
return logger;
}
}