selenium - 如何在 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
这里需要做哪些改变?
解决方案
正如我在评论中所说,您的问题与我提供答案的另一个问题非常相似。我对您的问题的回答将非常相似,但使用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
推荐阅读
- java - 除非单击可编辑单元格,否则 SWT TableViewer 单元格不会显示图像
- amazon-web-services - 为什么我的 Amazon S3 存储桶的预签名 URL 在我指定的到期时间之前到期?
- c# - 无法从代码访问数据库,但可以使用 SSMS
- java - 在 AWS Lambda Authorizer 中访问 URL 路径
- kotlin - 让我们用 vert.x 加密
- android - 如何通过改造发布数据并以正确的格式获得响应?
- shell - 如何组合两个正则表达式(模式)值 int one
- node.js - 将 QS 查询字符串转换为弹性云查询
- docker - 获取容器指标 cpu 负载
- java - 如何使用 Spring Boot Batch Job 更新数据库中的大量数据