Log4j输出未在Eclipse控制台中显示

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

我在unit testing中所做的就是以下内容,由于某种原因,只有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 for Java Developers,Version:Helios Release,Build id:20100617-1415

转到eclipse中的运行配置然后-VM参数添加:-Dlog4j.configuration = log4j-config_folder / log4j.xml

将log4j-config_folder替换为您拥有log4j.xml文件的文件夹结构

log4j.propertieslog4j.xml文件中查找日志级别。 它可能设置为ERROR而不是DEBUG

使用BasicConfigurator.configure();配置BasicConfigurator.configure(); 设置调试时设置的基本控制台appender。 具有上述设置且没有其他代码(测试除外)的项目应在控制台中生成三行日志记录。 我不能说“它对我有用”。

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

另外,为了让@Before方法运行:

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

编辑:

如果您一次运行多个测试,则每个测试都将在运行前调用init。

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

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

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

测试用例 – 这将导致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方法来测试它。

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

有一点需要注意,如果类路径上有log4j.properties文件,则无需调用BasicConfigurator。 此处提供了有关如何配置属性文件的说明。

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

认为这是一个真正的缺陷,但事实certificate我的控制台大小是有限的,并导致旧的内容超过80000字符被切断。

右键单击控制台以获取首选项并增加控制台大小限制。

检查log4j.properties文件

点击此处查看简单示例。

确保在运行junit测试用例时,您的test / resources文件夹中包含log4j.properties或log4j.xml文件。

听起来像log4j会选择另一个配置文件而不是你认为的配置文件。

在log4j中放置一个断点,打开文件并查看文件getAbsolutePath()。

检查输出(即bin或target / classes)目录中或生成的项目工件(.jar / .war / .ear)中的log4j配置文件。 如果这是在你的类路径上,它会被log4j选中。

将测试依赖项添加到您的pom到slf4j。

   org.slf4j slf4j-simple ${slf4j.version} test  

检查log4j.propertieslog4j.xml是否已复制到IDE类路径并在调用BasicConfigurator.configure()时加载

我曾经有过像这样的问题,当我从亚马逊下载一个lib(对于amazon web services)时,那个jar文件包含了一个log4j.properties,而且不知怎的,它被用来代替我那个旧的,自我配置的log4j。 值得一试。

我做了一个案例:exception发生在某个地方,但我抓住了exception而没有打印任何东西,因此代码甚至没有达到log4j代码,所以没有输出。

我有同样的错误。

我正在使用Jboss 7.1 AS。 在配置文件 – standalone.xml中编辑以下标记。 (停止服务器并编辑)

         

ALL具有最低级别,旨在打开所有日志记录。

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

单击进入Eclipse控制台窗口 – >首选项 – >控制台并确保选中该复选框

程序写入标准输出时显示

活跃。

或者,您可以将log4j配置为始终写入System.err,如下所示:

                

如果log4j.xml文件不在项目中,并且您正在使用tomcat,请尝试转到tomcat实例并搜索log4j。 尝试更改consoleAppender级别以在tomcat中调试和重新部署应用程序。 这可能有所帮助。

我的情况通过指定正在调试的JAVA程序的VM参数来解决,我假设你也可以在`eclipse.ini文件中设置它:

启用调试级别,在月食