2010-08-17 135 views
21

由于某种原因,当我运行JUnit测试时,我的Eclipse控制台不再显示Log4j INFO和DEBUG语句。 在代码方面没有任何改变,所以它必须与Eclipse配置有关。未在Eclipse控制台中显示Log4j输出

我在单元测试中做的所有事情如下,出于某种原因,只有ERROR语句显示在Eclipse控制台中。为什么? 我在哪里寻找线索?

public class SampleTest 
{ 
    private static final Logger LOGGER = Logger.getLogger(SampleTest.class); 

    @Before 
    public void init() throws Exception 
    { 
     // Log4J junit configuration. 
     BasicConfigurator.configure(); 

     LOGGER.info("INFO TEST"); 
     LOGGER.debug("DEBUG TEST"); 
     LOGGER.error("ERROR TEST"); 
    } 
} 

详情:

  • 的log4j-1.2.6.jar
  • 的junit-4.6.jar的Eclipse
  • IDE为Java开发者,版本: 太阳神发布,建立ID: 20100617 -1415
+3

您是否已经得到了答案?他们几乎解释了所有可能的解决方案,因此无论是谁帮助,这都会很有趣。 – user357206 2010-09-02 07:52:31

回答

9

看看log4j.propertieslog4j.xml fi le为日志级别。它可能设置为ERROR而不是DEBUG

+1

感谢您的回复Aaron。我已经检查了log4.properties,并将其设置为INFO。现在我已将它更改为DEBUG,但它没有任何区别。任何其他想法? log4j.rootLogger = DEBUG,标准输出 log4j.appender.stdout = org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout = org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern = %t:%d {ddMMMyy HH:mm:ss.SSS}%-5p(%F:%L)%m%n – javaExpert 2010-08-17 10:23:06

+12

将'-Dlog4j.debug'添加到您的VM环境启动属性以使log4j打印出它的调试info - 可能在类路径上选择了一个不同的log4j配置文件(比如打包在JAR中的一个文件),这个配置文件比您打算使用的配置文件 – 2010-08-17 11:35:09

+0

@javaExpert:在这种情况下,它会在类路径的某处找到不同的log4j.properties文件。也看看你的JAR! – 2010-08-17 12:23:38

6

有一点需要注意,如果在类路径中有一个log4j.properties文件,则不需要调用BasicConfigurator。如何配置属性文件的说明是here

您可以通过尝试在命令行中使用log4j.jar和log4j.properties在您的类路径中运行此类来查明您的IDE是否导致此问题。

9

使用BasicConfigurator.configure();进行配置会在调试时设置一个基本的控制台appender。使用上述设置并且没有其他代码(测试除外)的项目应在控制台中生成三行日志记录。除了“它适用于我”之外,我不能说任何其他的东西。

你是否试过用log4j和junit创建一个空项目,只有上面的代码并运行它?

而且,为了获得@Before方法运行:

@Test 
public void testname() throws Exception { 
    assertTrue(true); 
} 

编辑:

如果您同时运行多个测试,他们每个人都会在运行之前调用初始化。

在这种情况下,如果您有两个测试,第一个会有一个记录器,第二个测试会再次调用init,使其记录两次(尝试它) - 您应该在控制台中使用两个测试获得9行记录。

您可能想要使用注释为@BeforeClass的静态init方法来避免这种情况。虽然这也发生在跨文件中,但您可能需要查看JUnit 4中的TestSuites文档。并且/或者在@AfterClass注释类中调用BasicConfigurator.resetConfiguration();,以在每个测试类/测试套件后删除所有记录器。

此外,根记录器被重用,因此,如果您在早期运行的测试方法中设置根记录器的级别,它将保留此设置以便稍后运行的所有其他测试,即使它们位于不同的文件中。 (重置配置时不会发生)。

测试用例 - 这将导致9号线的日志记录:

import static org.junit.Assert.assertTrue; 

import org.apache.log4j.BasicConfigurator; 
import org.apache.log4j.Logger; 
import org.junit.Before; 
import org.junit.Test; 

public class SampleTest 
{ 
    private static final Logger LOGGER = Logger.getLogger(SampleTest.class); 

    @Before 
    public void init() throws Exception 
    { 
     // Log4J junit configuration. 
     BasicConfigurator.configure(); 
    } 

    @Test 
    public void testOne() throws Exception { 
     LOGGER.info("INFO TEST"); 
     LOGGER.debug("DEBUG TEST"); 
     LOGGER.error("ERROR TEST"); 

     assertTrue(true); 
    } 

    @Test 
    public void testTwo() throws Exception { 
     LOGGER.info("INFO TEST"); 
     LOGGER.debug("DEBUG TEST"); 
     LOGGER.error("ERROR TEST"); 

     assertTrue(true); 
    } 
} 

更改init方法减少了对例外六行:

@BeforeClass 
public static void init() throws Exception 
{ 
    // Log4J junit configuration. 
    BasicConfigurator.configure(); 
} 

你的问题可能是导致其他一些测试类或测试套件,根记录器的日志记录级别设置为ERROR,并且不重置。

你也可以通过重新设置的@BeforeClass方法,设置登录之前测试了这一点。

请注意,这些更改可能会中断其他测试用例的预期日志记录,直到它在所有位置都得到修复。我建议尝试一下如何在单独的工作区/项目中工作,以了解它是如何工作的。

+0

我试图创建一个只有log4j,junit和上面的代码的空项目,它完美的工作,即打印所有3条语句。 是否有一些覆盖BasicConfigurator的Eclipse项目级别设置? – javaExpert 2010-08-17 11:52:19

+0

不,我很确定Eclipse最好不要直接以任何方式影响项目;在编辑答案中提出问题的提示来源。 在测试源文件夹中为测试保留一个不同的'log4j.properties'文件是正常的,以便让被测试的类的日志与应用程序的日志不同。 – Tormod 2010-08-17 12:43:16

0

检查您的log4j.propertieslog4j.xml调用BasicConfigurator.configure()

+0

在测试文件夹中放置一个空的log4j.properties。 – javaExpert 2010-09-22 10:48:25

1

时被复制到你的IDE类路径和负载听起来像log4j的拿起比你想象的那样的彼此配置文件。

将断点在log4j的文件被打开,其中,有一个看文件getAbsolutePath()。

1

在输出检查log4j的配置文件(即仓或目标/班)目录或生成的项目工件内(的.jar /的.war /的.ear)。如果这是你的类路径,它会被log4j拾取。

18

去跑在Eclipse配置,那么-VM参数补充一点: -Dlog4j.configuration = log4j的-config_folder/log4j.xml文件

与你有你的log4j.xml文件夹结构取代的log4j,config_folder文件

+0

感谢您的建议。这样它的工作! 虽然我仍然有点恼火,原因有两个: 1)我想如果我使用BasicConfigurator.configure(),我不必打扰有log4j。属性 2)当我运行一个简单的JUnit测试时,我只想右击clik并“运行”,而不必定义配置 我再次尝试了我的原始测试,但添加了以下行以查看它是否正在使用Eclipse中某处定义了一些变量: System.out.println(System.getProperty(“log4j.configuration”)); 但它打印出“null” – javaExpert 2010-08-17 13:50:06

+0

hmmm ..有趣的.. k ll回到yu – 2010-08-18 08:59:25

+2

将'-Dlog4j.debug'添加到此Eclipse启动配置的JVM参数中。 – 2016-07-30 17:02:22

2

认为这是一个真正的缺陷,但事实证明,我的控制台大小是有限的,并引起了旧内容过去80000个字符被切断。

右键单击控制台上的首选项并增加控制台大小限制。

0

我曾经有过这样的问题,当我从亚马逊下载一个lib(对于Amazon webservices),并且该jar文件包含log4j.properties,并以某种方式被用来代替我的旧的自我配置的log4j。值得一检查。

2

检查log4j.properties这里提交

检查简单的例子,在here

0

有一种情况我使: 异常发生在某处,但我没有打印任何东西,因此代码甚至没有达到log4j代码,因此没有输出就捕获异常。

2

确保运行JUnit测试案例的时候,你有你的测试/资源文件夹中的log4j.properties或文件的log4j.xml。

0

我有同样的错误。

我正在使用Jboss 7.1 AS。在配置文件 - standalone.xml中编辑下面的标签。(停止你的服务器并编辑)

 <root-logger> 
      <level name="ALL"/> 
      <handlers> 
       <handler name="CONSOLE"/> 
       <handler name="FILE"/> 
      </handlers> 
    </root-logger> 

ALL具有最低的可能级别,并打算打开所有日志记录。

0

Eclipse控制台窗口具有Filter属性(在某些情况下,只有system.err处于活动状态)。

Rigt点击进入Eclipse控制台窗口 - >首选项 - >控制台,并确保复选框

显示,当程序写入标准输出

处于活动状态。

另外,您可以配置log4j来送花儿给人写信给System.err的是这样的:

<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> 
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> 
    <appender name="AppConsole" class="org.apache.log4j.ConsoleAppender"> 
     <param name="Target" value="System.err" /> 
     <param name="Encoding" value="ISO-8859-15" /> 
     <layout class="org.apache.log4j.PatternLayout"> 
      <param name="ConversionPattern" 
       value="%d{dd.MM.yyyy HH:mm:ss} %5p kontext.%c{1}:%L - %m%n" /> 
     </layout> 
    </appender> 
    <root> 
     <level value="debug" /> 
     <appender-ref ref="AppConsole" /> 
    </root> 
</log4j:configuration> 
1

添加一个测试依赖于你的POM以SLF4J。

 <dependency> 
      <groupId>org.slf4j</groupId> 
      <artifactId>slf4j-simple</artifactId> 
      <version>${slf4j.version}</version> 
      <scope>test</scope> 
     </dependency> 
0

如果的log4j.xml文件不在该项目,使用的是Tomcat,尝试将Tomcat实例并搜索log4j的。尝试更改consoleAppender级别以在tomcat中调试和重新部署应用程序。这可能有帮助。

0

我的情况是由specifing VM参数到JAVA程序正在调试解决了,我想你也可以设置这`eclipse.ini文件藏汉:

enable-debug-level-in-eclipse