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

时间:2010-08-17 10:12:00

标签: java eclipse junit log4j

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

我在单元测试中所做的全部内容如下,由于某些原因,只有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
  • 适用于Java开发人员的IDE,版本: Helios发布,​​构建ID: 20100617-1415

18 个答案:

答案 0 :(得分:20)

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

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

答案 1 :(得分:11)

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

答案 2 :(得分:9)

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

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

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

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

编辑:

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

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

您可能希望使用带有@BeforeClass注释的静态init方法来避免这种情况。虽然这也发生在文件之间,但您可能希望查看JUnit 4中的TestSuite文档。和/或在@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方法来测试它。

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

答案 3 :(得分:6)

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

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

答案 4 :(得分:2)

检查log4j.properties文件

here处查看简单示例。

答案 5 :(得分:2)

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

答案 6 :(得分:2)

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

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

答案 7 :(得分:1)

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

答案 8 :(得分:1)

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

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

答案 9 :(得分:1)

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

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

答案 10 :(得分:0)

我曾经遇到过这样的问题,当我从亚马逊(亚马逊网络服务)下载一个lib并且该jar文件包含一个log4j.properties时,不知怎的,它被用来代替我那个旧的,自我配置的log4j。值得一试。

答案 11 :(得分:0)

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

答案 12 :(得分:0)

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

答案 13 :(得分:0)

我遇到了同样的错误。

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

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

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

答案 14 :(得分:0)

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

Rigt点击进入Eclipse控制台窗口 - &gt;偏好 - &gt;控制台并确保复选框

在程序写入标准输出时显示

有效。

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

{{1}}

答案 15 :(得分:0)

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

答案 16 :(得分:0)

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

enable-debug-level-in-eclipse

答案 17 :(得分:0)

一个简单的log4j.properties文件如下所示:

log4j.rootCategory=debug,console

log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.target=System.out
log4j.appender.console.immediateFlush=true
log4j.appender.console.encoding=UTF-8
log4j.appender.console.threshold=info

log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.conversionPattern=%d [%t] %-5p %c - %m%n

将其放在您的班级路径(target / classes文件夹)中。或者,如果您有Maven项目,请将其放在src / main / resources下,Eclipse会将其复制到您的类路径中。

没有配置文件,您应该在控制台中看到如下所示的Eclipse警告:

log4j:WARN No appenders could be found for logger.
log4j:WARN Please initialize the log4j system properly.