在有了Position类和接口类之后,我们是不是立刻就要着手开始写实现类了呢?按照一般的顺序是这样。但是,我们这里先停一下。原因有二:
1)既然是写一个框架,我们希望总体的功能上是全面的。实现类中,我们需要设计和实现各种具体的操作方法。那么,如果中间出了问题,我们希望能够有所记录(log),所以需要有一个Log类。
2)既然是需要记录,我们希望能够在每次测试的测试报告中,体现该次测试操作的记录。那么,就需要对所做的测试进行监听,所以我们也需要一个监听(Listener)的类。
在写log类之前,我们需要在项目中导入log4j的jar包,具体的下载地址:https://mvnrepository.com/artifact/log4j/log4j
在导入log4j-1.2.17.jar的包后,我们开始着手写Log类。
package webui.xUtils; import java.io.File; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Properties; import org.apache.log4j.Logger; import org.apache.log4j.PropertyConfigurator; public class logUtil { private final Class<?> clazz; private Logger logger; //这里是定义logUtil的构造函数,因为不明确需要记录log的类是什么样子的,所以使用泛型Class<?> clazz public logUtil(Class<?> clazz) { this.clazz = clazz; this.logger = Logger.getLogger(this.clazz); logUtil.initlog4j(); } //定义记录log的方法 private static void initlog4j() { //创建Propderties对象 Properties prop = new Properties(); /*Log4j建议只使用四个级别,优先级从高到低分别是ERROR、WARN、INFO、DEBUG 这里定义能显示到的最低级别,若定义到INFO级别,则看不到DEBUG级别的信息了~!级别后面是输出端*/ prop.setProperty("log4j.rootLogger", "INFO,CONSOLE,E,F"); prop.setProperty("log4j.appender.CONSOLE", "org.apache.log4j.ConsoleAppender"); prop.setProperty("log4j.appender.CONSOLE.layout", "org.apache.log4j.PatternLayout"); prop.setProperty("log4j.appender.CONSOLE.layout.ConversionPattern", "[%d{YYYY-MM-dd HH:mm:ss,SSS}] %-5p %c %m%n"); //设置日志输出的路径 String src = "test-output/log"; //设置日期格式 SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd"); //获取当前日期,并根据当前的日期建立文件夹,将生成的.log文件放入当前日期的文件夹。 String date=dateFormat.format(new Date()).toString(); File dir = new File(src+"/"+date); if (!dir.exists()){ dir.mkdirs(); } String filepath=dir.getAbsolutePath()+"/"+"log_"+date+".log"; prop.setProperty("log4j.appender.E","org.apache.log4j.FileAppender"); prop.setProperty("log4j.appender.E.file",filepath); prop.setProperty("log4j.appender.E.layout","org.apache.log4j.PatternLayout"); prop.setProperty("log4j.appender.E.layout.ConversionPattern", "[%d{YYYY-MM-dd HH:mm:ss,SSS}] %-5p %c %m%n"); prop.setProperty("log4j.appender.F","org.apache.log4j.FileAppender"); prop.setProperty("log4j.appender.file.encoding","UTF-8"); //生成Html格式的日志,并将生成的.html的日志文件放入当前日期的文件夹。 String filepathHtml=dir.getAbsolutePath()+"/"+"log_"+date+".html"; prop.setProperty("log4j.appender.F.file",filepathHtml); prop.setProperty("log4j.appender.F.layout","org.apache.log4j.HTMLLayout"); //prop.setProperty("log4j.appender.F.layout.ConversionPattern", "[%d{YYYY-MM-dd HH:mm:ss,SSS}] %-5p %c %m%n"); PropertyConfigurator.configure(prop); } public void info(String message) { logger.info(message); } public void debug(String message) { logger.debug(message); } public void error(String message) { logger.error(message); } public void trace(String message) { logger.trace(message); } }
到此,log类就算完成了。在使用的时候,直接定义一个实例来调用相应的方法即可。例如: logUtil logs = new logUtil(X.class);
另外,除了logUtil中定义的样式,在需要记录的地方,可以调用该类中相应的方法,比如logs.info("测试开始"),那么在执行相应程序的时候,这段话就会被记录在log文件中。这样,就方便我们自己定义log的内容了。