[英]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");
}
}
細節:
轉到eclipse中的運行配置然后-VM參數添加:-Dlog4j.configuration = log4j-config_folder / log4j.xml
將log4j-config_folder替換為您擁有log4j.xml文件的文件夾結構
在log4j.properties
或log4j.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.properties
或log4j.xml
是否已復制到IDE類路徑並在調用BasicConfigurator.configure()
時加載
一個簡單的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.