何らかの理由で、JUnitテストを実行するときに、EclipseコンソールにLog4j INFOおよびDEBUGステートメントが表示されなくなりました。コードに関しては、変更は行われていないため、Eclipse構成に関係する必要があります。
ユニットテストで行うことは次のとおりで、何らかの理由でEclipseコンソールにERRORステートメントのみが表示されます。どうして?どこから手がかりを探すべきですか?
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();
で設定すると、デバッグ時に基本的なコンソールアペンダーセットが設定されます。上記のセットアップを使用し、他のコード(テストを除く)を持たないプロジェクトでは、コンソールに3行のログを記録する必要があります。 「それは私のために働く」以外何も言えません。
上記のコードのみを使用して、log4jとjunitだけで空のプロジェクトを作成して実行しましたか?
また、実行中の_@Before
_ methodを取得するには:
_@Test
public void testname() throws Exception {
assertTrue(true);
}
_
編集:
一度に複数のテストを実行する場合、各テストは実行前にinitを呼び出します。
この場合、2つのテストがある場合、最初のテストは1つのロガーを持ち、2番目のテストは再びinitを呼び出して2回ログを記録します(試してみます)-2つのテストでコンソールに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メソッドを変更すると、例外の6行になります。
_@BeforeClass
public static void init() throws Exception
{
// Log4J junit configuration.
BasicConfigurator.configure();
}
_
問題はおそらく、ルートロガーのログレベルがERRORに設定され、リセットされない他のテストクラスまたはテストスイートで発生します。
また、ログを設定する前に、@ BeforeClassメソッドでリセットすることでこれをテストできます。
これらの変更は、すべての場所で修正されるまで、他のテストケースの予想されるログ記録を中断する可能性があることに注意してください。これが別のワークスペース/プロジェクトでどのように機能するかを試して、どのように機能するかを理解することをお勧めします。
注意すべき点として、クラスパスにlog4j.propertiesファイルがある場合、BasicConfiguratorを呼び出す必要はありません。プロパティファイルの設定方法の説明は here です。
クラスパスでlog4j.jarおよびlog4j.propertiesを使用してコマンドラインからこのクラスを実行しようとすることで、IDEが問題の原因であるかどうかを特定できます。
Junitテストケースを実行するときに、test/resourcesフォルダーにlog4j.propertiesまたはlog4j.xmlファイルがあることを確認してください。
Log4j.propertiesファイルを確認してください
here で簡単な例を確認してください。
これは本物の欠陥だと思っていましたが、コンソールのサイズが制限されていて、80000文字を超える古いコンテンツが切り捨てられたことがわかりました。
プリファレンスのコンソールを右クリックして、コンソールのサイズ制限を増やします。
Log4jのように聞こえますが、あなたが考えているものとは別の設定ファイルを選択します。
ファイルが開かれるlog4jにブレークポイントを置き、ファイルgetAbsolutePath()を確認します。
テストの依存関係をpomにslf4jに追加します。
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>${slf4j.version}</version>
<scope>test</scope>
</dependency>
出力(binまたはtarget/classes)ディレクトリまたは生成されたプロジェクトアーティファクト(.jar/.war/.ear)内でlog4j構成ファイルを確認します。これがクラスパス上にある場合、log4jによって取得されます。
Amazonからlib(Amazon Webサービス用)をダウンロードし、そのjarファイルにlog4j.propertiesが含まれていて、古くて自己設定されたlog4jの代わりに使用されたときに、このような問題が発生しました。チェックする価値があります。
私が作るケースがあります:例外はどこかで発生しますが、何も印刷せずに例外をキャッチしたため、コードはlog4jコードに到達しなかったため、出力はありませんでした。
_log4j.properties
_または_log4j.xml
_がIDEクラスパスにコピーされ、BasicConfigurator.configure()
を呼び出すときにロードされることを確認します
log4j.xmlファイルがプロジェクトになく、Tomcatを使用している場合は、Tomcatインスタンスに移動してlog4jを検索してください。 consoleAppenderレベルを変更して、Tomcatでアプリケーションをデバッグおよび再デプロイしてください。それが役立つかもしれません。
Eclipseコンソールウィンドウにはフィルタープロパティがあります(場合によっては、system.errのみがアクティブになります)。
Rigtは、Eclipseコンソールウィンドウ->設定->コンソールをクリックして、そのチェックボックスを確認します。
プログラムが標準出力に書き込むタイミングを表示
アクティブです。
あるいは、次のように常にSystem.errに書き込むようにlog4jを構成できます。
<?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>
同じエラーが発生しました。
Jboss 7.1 ASを使用しています。構成ファイル-standalone.xmlで、次のタグを編集します。 (サーバーを停止して編集)
<root-logger>
<level name="ALL"/>
<handlers>
<handler name="CONSOLE"/>
<handler name="FILE"/>
</handlers>
</root-logger>
ALLは可能な限り低いランクを持ち、すべてのロギングをオンにすることを目的としています。
単純な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.