簡體   English   中英

Log4j輸出未在Eclipse控制台中顯示

[英]Log4j output not displayed in Eclipse console

出於某種原因,當我運行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
  • 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是否導致此問題。

檢查log4j.properties文件

這里檢查在簡單的例子在這里

確保在運行junit測試用例時,您的test / resources文件夾中包含log4j.properties或log4j.xml文件。

認為這是一個真正的缺陷,但事實證明我的控制台大小有限,並導致舊的內容超過80000字符被切斷。

右鍵單擊控制台以獲取首選項並增加控制台大小限制。

將測試依賴項添加到您的pom到slf4j。

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

聽起來像log4j會選擇另一個配置文件而不是你認為的配置文件。

在log4j中放置一個斷點,打開文件並查看文件getAbsolutePath()。

檢查輸出(即bin或target / classes)目錄中或生成的項目工件(.jar / .war / .ear)中的log4j配置文件。 如果這是在你的類路徑上,它會被log4j選中。

我曾經有過像這樣的問題,當我從亞馬遜下載一個lib(對於亞馬遜網絡服務)時,那個jar文件包含了一個log4j.properties,而且不知怎的,它被用來代替我那個舊的,自我配置的log4j。 值得一試。

我有一個案例:異常發生在某個地方,但我抓住了異常而沒有打印任何東西,因此代碼甚至沒有達到log4j代碼,所以沒有輸出。

我有同樣的錯誤。

我正在使用Jboss 7.1 AS。 在配置文件 - standalone.xml中編輯以下標記。 (停止服務器並編輯)

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

ALL具有最低級別,旨在打開所有日志記錄。

Eclipse控制台窗口具有過濾器屬性(在某些情況下,只有system.err處於活動狀態)。

單擊進入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> 

如果log4j.xml文件不在項目中,並且您正在使用tomcat,請嘗試轉到tomcat實例並搜索log4j。 嘗試更改consoleAppender級別以在tomcat中調試和重新部署應用程序。 這可能有所幫助。

檢查log4j.propertieslog4j.xml是否已復制到IDE類路徑並在調用BasicConfigurator.configure()時加載

我的情況通過指定正在調試的JAVA程序的VM參數來解決,我假設你也可以在`eclipse.ini文件中設置它:

啟用調試級別,在月食

一個簡單的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

將它放在類路徑(目標/類文件夾)中。 或者,如果您有Maven項目,請將其放在src / main / resources下,Eclipse會將其復制到您的類路徑中。

如果沒有配置文件,您應該在控制台中看到Eclipse警告,如下所示:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM