这个实例的作用是,在测试过程中,使用Log4j在日志文件中打印日志,用于监控和后续调试测试脚本。
具体过程:
1、自行下载Log4j的包,此处用的是log4j-1.2.17.zip。
2、解压缩包,把解压缩后的jar包添加到eclipse的工程的Build Paht中即可。
3、在测试代码的工程的src同级创建并设置log4j.properties,内容如下:
### 设置### log4j.rootLogger = debug,D,E,info ### 输出信息到控制抬 ### #log4j.appender.stdout = org.apache.log4j.ConsoleAppender #log4j.appender.stdout.Target = System.out #log4j.appender.stdout.layout = org.apache.log4j.PatternLayout #log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n ### 输出DEBUG 级别以上的日志到=F:\workspace\WebDriver API\log\\logerror.log ### log4j.appender.D = org.apache.log4j.DailyRollingFileAppender log4j.appender.D.File = F://workspace/WebDriver API/log/loglog.log log4j.appender.D.Append = true log4j.appender.D.Threshold = DEBUG log4j.appender.D.layout = org.apache.log4j.PatternLayout log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH\:mm\:ss} [%c-%L]-[%p] %m%n ### 输出ERROR 级别以上的日志到=F:\workspace\WebDriver API\log\\logerror.log ### log4j.appender.E = org.apache.log4j.DailyRollingFileAppender log4j.appender.E.File =F://workspace/WebDriver API/log/logerror.log log4j.appender.E.Append = true log4j.appender.E.Threshold = ERROR log4j.appender.E.layout = org.apache.log4j.PatternLayout log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH\:mm\:ss} [%c-%L]-[%p] %m%n ### 输出info 级别以上的日志到=F:\workspace\WebDriver API\log\\loginfo.log ### log4j.appender.info = org.apache.log4j.DailyRollingFileAppender log4j.appender.info.File =F://workspace/WebDriver API/log/loginfo.log log4j.appender.info.Append = true log4j.appender.info.Threshold = INFO log4j.appender.info.layout = org.apache.log4j.PatternLayout log4j.appender.info.layout.ConversionPattern = %-d{yyyy-MM-dd HH\:mm\:ss} [%c-%L]-[%p] %m%n
配置具体解析:
(1)、log4j.rootLogger = level , appenderName, appenderName, …其中lelve是定义的输出级别,低于该级别的将不会输出,主要级别有OFF、ALL、FATAL、ERROR、WARN、INFO、DEBUG或自定义级别,其中OFF设定的话将不输出任何信息,ALL设定的话将输出所有信息;另外5个的级别FATAL>ERROR>WARN>INFO>DEBUG,如果你的lenel设定为INFO,那么不能输出DEBUG信息;
appenderName是指定日志信息输出到哪个地方,控制台,文件等等,可同时指定多个输出目的地。
(2)、log4j.appender,这个也是必须配置的,它是负责控制日志记录操作的输出。它的定义格式如下:
log4j.appender.appenderName=someAppender(选择一种输出平台)
log4j.appender.appenderName.File=文件名](文件输出定义路径)
log4j.appender.appenderName.layout=输出布局
log4j.appender.appenderName.layout.ConversionPattern=输出格式
其中log4j.appender.appenderName指定输出appender,Log4J提供了一下几种appender:
a),org.apache.log4j.ConsoleAppender(控制台)
b),org.apache.log4j.FileAppender(文件)
c),org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
d),org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件,可通过log4j.appender.R.MaxFileSize=100KB设置文件大小,还可通过log4j.appender.R.MaxBackupIndex=1设置为保存一个备份文件)。
e),org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
log4j.appender.appenderName.layout指定日志信息的格式(布局)Layout,它负责格式化Appender的输出。Log4j提供的layout有以下几种:
org.apache.log4j.HTMLLayout(以HTML表格形式布局)
org.apache.log4j.PatternLayout(可以灵活地指定布局模式)
org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串)
org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)。
log4j.appender.appenderName.layout.ConversionPattern格式化日志信息,Log4J采用类似C语言中的printf函数的打印格式格式化日志信息,打印参数如下:
%m 输出代码中指定的消息
%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
%r 输出自应用启动到输出该log信息耗费的毫秒数
%c 输出所属的类目,通常就是所在类的全名
%t 输出产生该日志事件的线程名
%n 输出一个回车换行符,Windows平台为“rn”,Unix平台为“n”
%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyyy MMM dd HH:mm:ss,SSS},输出类似:2012年06月24日 23:55:28,92
%l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。
(3),log4j.logger
这个不是必需的,如果不配置这个,则采用log4j.rootLogger的level级别。它主要是具体到package、Class级别的info,它的定义格式如下:
log4j.logger.packageName[.ClassName]=level[,appender]
它也可以输出到指定的appender,也可以不指定输出到默认appender。
4、定义一个Log工具类,内容如下:
package cn.om.log4j; import org.apache.log4j.Logger; public class Log { //初始化一个logger对象 private static Logger Log=Logger.getLogger(Log.class); public static void startTestCase(String sTestCaseName){ Log.info("-----------------------------------------------"); Log.info("*********** "+sTestCaseName+" *************"); } //定义一个静态方法,可以打印自定义的某个测试用例结束执行的日志信息 public static void endTestCase(String sTestCaseName){ Log.info("*********** "+"测试用例执行结束"+" ***********"); Log.info("-----------------------------------------------"); } //定义一个静态info方法,打印自定义的info级别日志信息 public static void info(String message){ Log.info(message); } //定义一个静态warn方法,打印自定义的warn级别日志信息 public static void warn(String message){ Log.warn(message); } //定义一个静态error方法,打印自定义的error级别日志信息 public static void error(String message){ Log.error(message); } //定义一个静态fatal方法,打印自定义的fatal级别日志信息 public static void fatal(String message){ Log.fatal(message); } //定义一个静态debug方法,打印自定义的debug级别日志信息 public static void debug(String message){ Log.debug(message); } }
5、建一个测试类TestSearch,内容如下:
package cn.om.log4j; import org.testng.annotations.Test; import org.testng.annotations.BeforeMethod; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; import org.testng.annotations.AfterMethod; public class TestSearch { WebDriver driver; String url = "http://www.sogou.com"; @Test public void testSearch() { Log.startTestCase("搜索"); driver.get(url); //打印“打开sogou首页”的日志信息 Log.info("打开sogou首页"); //在搜索框中输入“光荣之路自动化测试” driver.findElement(By.id("query")).sendKeys("光荣之路自动化测试"); Log.info("输入搜索关键字“光荣之路自动化测试”"); //单击“搜索”按钮 driver.findElement(By.id("stb")).click(); //打印“单击搜索按钮”的日志信息 Log.info("单击搜索按钮"); Log.error("错误"); //向日志文件中打印搜索测试用例执行结束的日志信息 Log.endTestCase("搜索"); } @BeforeMethod public void beforeMethod() { System.setProperty("webdriver.firefox.bin", "D:/Mozilla Firefox/firefox.exe"); driver = new FirefoxDriver(); url = "http://www.sogou.com"; } @AfterMethod public void afterMethod() { driver.quit(); } }
日志信息的优先级从高到低有ERROR、WARN、INFO、DEBUG,用来标记这条日志的重要程度。Log4j支持两种配置文件格式,一个是XML格式,一个是java特性文件(就是本文的格式),xml文件格式不另外介绍了。