首页 > 解决方案 > 如何在 Log4j 中创建单独的日志

问题描述

我对 log4j 很陌生,并且已经在我的代码中实现了它。我无法为我运行的每个测试用例创建单独的日志。这是我的 XML 文件

 <?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
       <Properties>
        <Property name="basePath">./logs</Property>
    </Properties>
 
  <Appenders>
                             
      <RollingFile name="File" fileName="${basePath}/ICETest.log" filePattern="${basePath}/ICETest-%d{yyyy-MM-dd-HH-mm-ss}.log">
       <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
      <SizeBasedTriggeringPolicy size="20000" />
          </RollingFile>
    <Console name="Console" target="SYSTEM_OUT">
      <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
    </Console>
  </Appenders>
  <Loggers>
    <Root level="all">
      <AppenderRef ref="File"/>
    </Root>
  </Loggers>
</Configuration>

这就是我在类文件中使用它的方式:

public class MyClass extends base {
    
    private static org.apache.logging.log4j.Logger log =LogManager.getLogger(MyClass.class.getName());

@BeforeTest

    public void initialize() throws IOException

    {

    driver =IntializeDriver();

    LoginPage  l = new LoginPage(driver);
    ArrayList d = RE.getData("initialize_ice");
    driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
    log.info("Chrome launched successfully");
    driver.get((String) d.get(1));

    // driver.get(prop.getProperty("url"));
    log.info("Page Navigated successfully");


    }

@Test
public void MyTest () throws IOException, InterruptedException
        {
        
    try
    {
         LoginPage l = new LoginPage(driver);
         
        //l.getUserName().sendKeys(prop.getProperty("mapcoord"));
         l.getUserName().sendKeys((String) d.get(3));
          Thread.sleep(1000);
        log.info("username entered successfully");
          Thread.sleep(1000);
        //l.Department().sendKeys(prop.getProperty("Dept"));
            l.Department().sendKeys((String) d.get(4));
             Thread.sleep(1000);
            log.info("Department entered successfully");
}
         catch (Exception e) {
             System.out.println("Ice page not logged In");
             }
             
        }



@AfterTest
public void teardown()
    {
        
        driver.close();
    log.info("browser closed successfully");
        
    }


}

还有许多其他类文件,现在它创建了一个名为 ICETest.log 的日志文件,我希望它为每个类创建一个单独的日志文件作为 classname.log

这里需要做哪些改变?

标签: seleniumlogginglog4jlog4j2java.util.logging

解决方案


正如我在评论中所说,您的问题与我提供答案的另一个问题非常相似。我对您的问题的回答将非常相似,但使用log4j2 的功能而不是上下文映射查找。EventLookup

下面是一些示例代码,用于演示如何根据记录器名称(通常与完整的类名匹配)生成单独的日志文件。

首先是log4j2.xml配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Appenders>
        <Routing name="myAppender">
            <Routes pattern="$${event:Logger}">
                <Route>
                    <File
                        fileName="logs/${event:Logger}.log"
                        name="myAppender-${event:Logger}">
                        <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
                    </File>
                </Route>
            </Routes>
        </Routing>
    </Appenders>
    <Loggers>
        <Root level="trace">
            <AppenderRef ref="myAppender" />
        </Root>
    </Loggers>
</Configuration>

接下来,一个带有 a 的类main作为控制器。此类将调用代表您的测试用例的其他 2 个类的运行方法。

package pkg;

public class Log4j2DiffFilePerLoggerMain {
    
    public static void main(String[] args){
        TestClass1 test1 = new TestClass1();
        test1.run();
        TestClass2 test2 = new TestClass2();
        test2.run();
    }
}

现在是第一个“测试用例”,它只是一个带有单个日志语句的 Java 类。

package pkg;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class TestClass1 implements Runnable{
    private static final Logger LOG = LogManager.getLogger();
    
    public void run() {
        LOG.info("Test 1 is running");
    }

}

最后是第二个测试用例,它几乎是第一个测试用例的精确副本,但带有不同的日志消息。

package pkg;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class TestClass2 implements Runnable{
private static final Logger LOG = LogManager.getLogger();
    
    public void run() {
        LOG.info("Test 2 is running");
    }
}

当您执行上述代码时,它将生成 2 个日志文件:

pkg.TestClass1.log
pkg.TestClass2.log

第一个日志将包含来自第一个测试类的消息,第二个将包含来自第二个类的消息。

pkg.TestClass1.log    
09:02:48.366 [main] INFO  pkg.TestClass1 - Test 1 is running

pkg.TestClass2.log
09:02:48.390 [main] INFO  pkg.TestClass2 - Test 2 is running

推荐阅读