【问题标题】:How to create separate logs in Log4j如何在 Log4j 中创建单独的日志
【发布时间】:2021-06-29 07:44:15
【问题描述】:

我对 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

这里需要做哪些改变?

【问题讨论】:

标签: selenium logging log4j log4j2 java.util.logging


【解决方案1】:

正如我在评论中所说,您的问题与another question 非常相似,我提供了answer。我对您的问题的回答将非常相似,但使用 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>

接下来,一个带有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

【讨论】:

    【解决方案2】:

    您应该删除此段

      <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>
    

    这将附加现有文件

    【讨论】:

    • 所以删除附加标签中的内容后,我应该添加其他东西还是可以正常工作?
    • 我试过了,但在进行此更改@Rathna 后它根本没有创建任何日志文件
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多