Log4j是个开源项目,可以控制日志信息的输出目的地,例如控制台、文件、GUI组件等,其配置文件用来设置日志的级别,文件格式只能是XML、json、yaml或properties
配置依赖
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
Log4j配置文件properties
log4j.rootLogger=info, toConsole, toFile
log4j.appender.file.encoding=UTF-8
log4j.appender.toConsole=org.apache.log4j.ConsoleAppender
log4j.appender.toConsole.Target=System.out
log4j.appender.toConsole.layout=org.apache.log4j.PatternLayout
log4j.appender.toConsole.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss}] [%p] %m%n
log4j.appender.toFile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.toFile.file=result/log/testlog.log
log4j.appender.toFile.append=false
log4j.appender.toFile.Threshold=info
log4j.appender.toFile.layout=org.apache.log4j.PatternLayout
log4j.appender.toFile.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss}] [%p] %m%n
Log4j引用
package com.davieyang.springboot;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
@SpringBootApplication
public class Application {
static Logger logger = Logger.getLogger(Application.class.getName());
public static void main(String[] args){
PropertyConfigurator.configure("log4j.properties");
SpringApplication.run(Application.class, args);
logger.debug("debug message");
logger.info("info message");
logger.error("error message");
}
}
Log4j配置文件XML
<?xml version="1.0" encoding = "GB2312" ?>
<!DOCTYPE log4j:configuration SYSTEM "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="true">
<appender name="fileAppender" class="org.apache.log4j.FileAppender">
<param name="Threshold" value="INFO" />
<param name="File" value="Automation.log" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d %-5p [%c{1}] %m %n" />
</layout>
</appender>
<root>
<level value="INFO"/>
<appender-ref ref="fileAppender"/>
</root>
</log4j:configuration>
二次封装
package util;
import org.apache.log4j.Logger;
import java.io.IOException;
public class LogUtil {
private static Logger Log = Logger.getLogger(LogUtil.class.getName());
public static void startTestCases(String testCaseName){
Log.info("------------------ \"" + testCaseName + "\"开始执行 -----------------");
}
public static void endTestCases(String testCaseName){
Log.info("------------------ \"" + testCaseName + "\"执行结束 -----------------");
}
public static void info(String message){
Log.info(message);
}
public static void error(String message, IOException e){
Log.error(message);
}
public static void debug(String message){
Log.debug(message);
}
}
引用Log4j
package util;
import org.apache.log4j.xml.DOMConfigurator;
import org.openqa.selenium.*;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.ie.InternetExplorerDriver;
import org.openqa.selenium.support.ui.Select;
import org.testng.Assert;
import org.testng.Reporter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import static constants.Constants.MainPageandNavigation_Property;
import static constants.Constants.Path_BrowserDrivers;
import static util.LogUtil.info;
public class KeyActionsUtil {
public static WebDriver driver;
private static GetElementUtil getElementUtil = new GetElementUtil(MainPageandNavigation_Property);
static {
DOMConfigurator.configure("log4j.xml");
}
public static WebDriver initBrowser(String browser) {
if(browser.equalsIgnoreCase("firefox")) {
System.setProperty("webdriver.gecko.driver", Path_BrowserDrivers+"geckodriver.exe");
driver = new FirefoxDriver();
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
info("启动Firefox浏览器");
}else if (browser.equalsIgnoreCase("ie")){
System.setProperty("webdriver.ie.driver",Path_BrowserDrivers+"IEDriverServer.exe");
driver = new InternetExplorerDriver();
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
info("启动IE浏览器");
}else {
System.setProperty("webdriver.chrome.driver",Path_BrowserDrivers+"chromedriver.exe");
driver = new ChromeDriver();
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
info("启动Chrome浏览器");
}
driver.manage().window().maximize();
info("最大化浏览器");
return driver;
}
public static void openBrowser(String url, String browser, int timeOutInSeconds) {
driver = initBrowser(browser);
driver.manage().timeouts().implicitlyWait(timeOutInSeconds, TimeUnit.SECONDS);
driver.get(url);
}
public static void navigate(String url){
driver.get(url);
info("访问地址为"+url);
}
public static void uploadFileName(String uploadpathandname){
try{
KeyBoardUtil.setAndctrlVClipboardData(uploadpathandname);
}catch (Exception e){
e.printStackTrace();
}
}
public static void twoWay(String ElementNameInproFile){
try {
List<WebElement> elements = driver.findElements(getElementUtil.getLocator(ElementNameInproFile));
elements.get(0).click();
System.out.println("按钮被成功点击");
}catch (Exception e){
e.printStackTrace();
}
}
public static void assertString(WebDriver driver,String assertstring){
try{
Assert.assertTrue(driver.getPageSource().contains(assertstring));
Reporter.log("成功断言关键字“"+ assertstring +"”");
}catch (AssertionError e){
Reporter.log("断言失败,具体失败信息为:" + e.getMessage());
System.out.println("断言失败");
throw e;
}
}
public static void assertNoString(WebDriver driver, String assertstring){
try{
Assert.assertFalse(driver.getPageSource().contains(assertstring));
info("成功断言关键字“"+ assertstring +"” + “不存在”");
}catch (AssertionError e){
info("断言失败,具体信息为:" + e.getMessage());
System.out.println("断言失败");
}
}
}
此处除了用到了封装好的info方法,还用到了TestNG的Reporter.log("断言失败,具体失败信息为:" + e.getMessage());
配置文件详解
Appenders配置项 |
描述 |
ConsoleAppender |
控制台,输出结果到system.out或system.err |
FileAppender |
输出结果到指定文件,同时可以指定输出数据的格式appender=true指定追加到文件末尾 |
DailyRollingFileAppender |
每天产生一个日志文件 |
RollingFileAppender |
文件大小到达指定数值后生成新的文件 |
WriterAppender |
将日志信息以流格式发送到任意指定的地方 |
Level值 |
描述 |
OFF |
关闭所有日志 |
FATAL |
致命错误 |
ERROR |
严重错误 |
WARN |
警告信息 |
INFO |
通知类一般类状态类普通信息 |
DEBUG |
调试信息 |
TRACE |
追踪信息 |
ALL |
输出所有日志 |
Layout配置项 |
描述 |
HTMLLayout |
以HTML表格形式布局 |
PatternLayout |
可以灵活的指定布局模式 |
SimpleLayout |
包含日志信息的级别和信息字符串 |
TTCCLayout |
包含日志产生的时间线程类别等信息 |
ConversionPatter配置项 |
描述 |
%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}, 输出类似于2020年8月20日3:39:00 921 |
%l |
输出日志事件的发生位置,包含类名线程以及代码中的行数 |