使用单独的类时,log4j2不写入文件

时间:2018-03-26 09:30:20

标签: java selenium logging log4j2

我目前正在尝试使用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类没有使用我的配置文件。我该如何解决这个问题?我甚至将它转换为非静态类,并使用构造函数进行实例化。但它似乎没有改变任何东西

1 个答案:

答案 0 :(得分:0)

查看导入org.apache.log4j.Logger和代码Logger log = Logger.getLogger(PhpTravelsJunit.class);,您似乎正在使用Log4j 1,但您的配置文件是Log4j 2样式。

您应该使用Log4j 2 org.apache.logging.log4j.Loggerorg.apache.logging.log4j.LogManager以及LogManager.getLogger(PhpTravelsJunit.class)或切换到Log4j 1(不是最佳选项)。

当然,你需要适当的依赖/ jars。

PS:抱歉,写错LogManager.getRootLogger代替LogManager.getLogger我犯了一个错误。