[英]log4j2 not writing in file when using a separate class
我目前正在尝试学习使用Selenium。 为此,我可以使用log4j2来记录进展顺利的情况,而不是失败的情况。 只要一切都在同一个类中,一切都可以正常工作。 我可以在控制台中看到日志,并且日志文件写得很好。 但是,当我尝试编写一个单独的类以便为代码提供结构时,一切都出错了。 就像找不到自定义XML属性文件一样。
这是我的XML属性文件的代码:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="debug">
<Properties>
<Property name="log-path">log</Property>
</Properties>
<Appenders>
<RollingFile name="file-log" fileName="${log-path}/logfile.log"
filePattern="${log-path}/logfile-%d{yyyy-MM-dd_HH}.log">
<PatternLayout>
<pattern>[%-5level] %d{yyyy-MM-dd_HH} [%t] %c{1} - %msg%n</pattern>
</PatternLayout>
<Policies>
<OnStartupTriggeringPolicy />
</Policies>
<DefaultRolloverStrategy max="20" />
</RollingFile>
<Console name="console" target="SYSTEM_OUT">
<PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Logger name="phptravels" level="info" additivity="false">
<appender-ref ref="file-log" level="info"/>
</Logger>
<Root level="info" additivity="false">
<appender-ref ref="console"/>
</Root>
</Loggers>
</Configuration>
这是我的“初始”代码的示例,该代码可以按照我的要求工作:
package phptravels;
import static org.junit.Assert.fail;
import java.io.File;
import java.util.NoSuchElementException;
import java.util.concurrent.TimeUnit;
import org.apache.log4j.Logger;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.NoAlertPresentException;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.Select;
import org.openqa.selenium.support.ui.WebDriverWait;
import outils.Log;
public class PhpTravelsJunit {
private boolean acceptNextAlert = true;
private StringBuffer verificationErrors = new StringBuffer();
private static WebDriver driver;
@Before
public void setUp() throws Exception {
System.setProperty("webdriver.chrome.driver", "C:\\Users\\scointe\\Documents\\Selenium\\chromedriver.exe");
driver = new ChromeDriver();
driver.manage().window().maximize() ;
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
System.setProperty("log4j2.configuration", "C:\\Users\\scointe\\Documents\\Eclipse\\SeleniumPractice\\properties\\log4j2.xml");
}
@Test
public void PhpTravelsJunit() throws Exception {
Logger log = Logger.getLogger(PhpTravelsJunit.class);
startTestCase(log, "PhpTravels - Parcours articles");
driver.navigate().to("http://automationpractice.com/");
log.info("Redirection sur l'url du site");
//on remplit le champ de recherche avec le texte "dress" et on clique sur le bouton de recherche
driver.findElement(By.id("search_query_top")).sendKeys("dress");
driver.findElement(By.name("submit_search")).click();
log.info("Recherche des articles comportant le texte \"dress\"");
//on trie les résultats pas prix croissant
Select order = new Select(driver.findElement(By.id("selectProductSort")));
order.selectByValue("price:asc");
log.info("Tri des résultats par prix croissant");
//On se place sur le menu flottant "Women" pour sélectionner la catégorie "Tops" qui apparaît
Actions actions = new Actions(driver);
actions.moveToElement(driver.findElement(By.className("sf-with-ul"))).perform();
WebDriverWait wait = new WebDriverWait(driver, 15);
WebElement tops = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath(".//*[@id='block_top_menu']/ul/li[1]/ul/li[1]/a")));
actions.moveToElement(tops).perform();
tops.click();
log.info("Clic sur la catégorie \"Tops\" dans le menu flottant \"Women\"");
//On applique un filtre sur la couleur, pour n'avoir que des articles noirs
driver.findElement(By.id("layered_id_attribute_group_11")).click();
log.info("Filtre sur la couleur. Noir uniquement");
endTestCase(log);
//...
}
public static void startTestCase(Logger log, String caseName) {
log.info("****************************************************************************************");
log.info("------------------------- "+caseName+ " -------------------------");
log.info("****************************************************************************************");
}
public static void endTestCase(Logger log) {
log.info("XXXXXXXXXXXXXXXXXXXXXXX "+"-E---N---D-"+" XXXXXXXXXXXXXXXXXXXXXX");
log.info("X");
log.info("X");
log.info("");
log.info("");
}
}
然后,我决定编写一个名为“ Log”的新类,该类应该管理所有Logger任务,如下所示:
package outils;
import org.apache.log4j.Logger;
public class Log {
private static Logger Log = Logger.getLogger(Log.class.getName());
//private static Logger Log = Logger.getLogger("devpinoyLogger");
public static void startTestCase(String caseName) {
Log.info("****************************************************************************************");
Log.info("------------------------- "+caseName+ " -------------------------");
Log.info("****************************************************************************************");
}
public static void endTestCase() {
Log.info("XXXXXXXXXXXXXXXXXXXXXXX "+"-E---N---D-"+" XXXXXXXXXXXXXXXXXXXXXX");
Log.info("X");
Log.info("X");
Log.info("");
Log.info("");
}
public static void info(String msg) {
Log.info(msg);
}
public static void warn(String msg) {
Log.warn(msg);
}
public static void error(String msg) {
Log.error(msg);
}
public static void fatal(String msg) {
Log.fatal(msg);
}
public static void debug(String msg) {
Log.debug(msg);
}
}
最后,这是我的新类的代码,该代码仅执行上述代码示例中所示的测试用例:
public class PhpTravelsNavigation {
private boolean acceptNextAlert = true;
private StringBuffer verificationErrors = new StringBuffer();
private static WebDriver driver;
@Before
public void setUp() throws Exception {
System.setProperty("webdriver.chrome.driver", "C:\\Users\\scointe\\Documents\\Selenium\\chromedriver.exe");
driver = new ChromeDriver();
driver.manage().window().maximize() ;
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
System.setProperty("log4j2.configuration", "C:\\Users\\scointe\\Documents\\Eclipse\\SeleniumPractice\\properties\\log4j2.xml");
}
@Test
public void PhpTravelsNavigation() throws Exception {
Log.startTestCase("PhpTravels - Parcours articles");
driver.navigate().to("http://automationpractice.com/");
Log.info("Redirection sur l'url du site");
//on remplit le champ de recherche avec le texte "dress" et on clique sur le bouton de recherche
driver.findElement(By.id("search_query_top")).sendKeys("dress");
driver.findElement(By.name("submit_search")).click();
Log.info("Recherche des articles comportant le texte \"dress\"");
//on trie les résultats pas prix croissant
Select order = new Select(driver.findElement(By.id("selectProductSort")));
order.selectByValue("price:asc");
Log.info("Tri des résultats par prix croissant");
//On se place sur le menu flottant "Women" pour sélectionner la catégorie "Tops" qui apparaît
Actions actions = new Actions(driver);
actions.moveToElement(driver.findElement(By.className("sf-with-ul"))).perform();
WebDriverWait wait = new WebDriverWait(driver, 15);
WebElement tops = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath(".//*[@id='block_top_menu']/ul/li[1]/ul/li[1]/a")));
actions.moveToElement(tops).perform();
tops.click();
Log.info("Clic sur la catégorie \"Tops\" dans le menu flottant \"Women\"");
//On applique un filtre sur la couleur, pour n'avoir que des articles noirs
driver.findElement(By.id("layered_id_attribute_group_11")).click();
Log.info("Filtre sur la couleur. Noir uniquement");
Log.endTestCase();
}
@After
public void tearDown() throws Exception {
//driver.quit();
String verificationErrorString = verificationErrors.toString();
if (!"".equals(verificationErrorString)) {
fail(verificationErrorString);
}
}
}
就像我说的那样,使用新代码,我只能在控制台中看到日志,并且我的日志文件中也没有任何内容。 文件已创建,但保持为空。 实际上,当我的工作代码仅创建一个新文件时,它甚至会覆盖具有相同名称的现有文件。
您是否知道可能导致这种情况的原因? 我不是Java专家,也不是一般的编码专家,但是欢迎所有答案。
如果您需要任何其他信息,请问我!
提前致谢 :)
编辑:经过几次测试,我可以确认我的Log类未使用我的配置文件。 我该如何解决? 我什至将其转换为非静态类,并使用构造函数实例化。 但这似乎并没有改变任何东西
查看您的导入org.apache.log4j.Logger
和代码Logger log = Logger.getLogger(PhpTravelsJunit.class);
似乎您正在使用Log4j 1,但是您的配置文件是Log4j 2样式。
您应该使用Log4j 2的org.apache.logging.log4j.Logger
和org.apache.logging.log4j.LogManager
和LogManager.getLogger(PhpTravelsJunit.class)
或切换到Log4j 1(不是最佳选择)。
当然,您都需要适当的依赖项/ jar。
PS:抱歉,我写了LogManager.getRootLogger
而不是LogManager.getLogger
犯了一个错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.