私はSpring Bootを使用しています。 1つのコンポーネントは、アプリケーションのデータベース構成プロパティをサポートし、データベースから取得したプロパティを使用してAppenderを初期化します。他のコンポーネントは静的ロガーのgetLogger()を通常のように呼び出します。apache log4j SpringでgetLogger()を呼び出した後、ルートロガーにアペンダを追加する
現在のところ、Springがアプリケーション構成コンポーネントを最初に初期化しているように見えるので、最初に初期化されていない場合は動作を監視できませんでした。私の質問は、appenderがルートにアタッチされる前にロガーが作成されていても、実行時に他のBeanを最初に初期化する必要があります。
サンプルコードので:それは何も影響する場合は、クラスBは、最初のインスタンス化されます場合
@Component
class A {
@PostConstruct
private void configureSystem() {
EnhancedPatternLayout patternLayout = new EnhancedPatternLayout();
patternLayout.setConversionPattern("%d{HH:mm:ss} %-5p [%t]: %m%n");
DailyRollingFileAppender fileAppender = new DailyRollingFileAppender(patternLayout, "/logs/default.log", "'.'yyyy-MM-dd");
fileAppender.setAppend(true);
fileAppender.setName("DefaultAppender");
fileAppender.setThreshold(Level.WARN);
fileAppender.activeOptions();
LogManager.getRootLogger().addAppender(fileAppender);
}
}
@Component
class B {
private static final Logger logger = LogManager.getLogger(B.class);
public void doSomething() {
logger.info("I did something!");
}
}
クラスBが「doSomethingのは、」すべてがロードされた後まで、私は思ったんだけどません。明らかに、Springに最初にインスタンス化するBeanを伝える方法はないので、必要な設定になっていることを保証することはできませんが、Springはこれを最初にインスタンス化してテストできません。私は問題にぶつかるのだろうか?
現在、最初にロードされていますが、最初にロードすることは保証できません。さらに、ビジネス要件にこの特定のクラスを使用してロードする必要があるため、log4jプロパティファイルまたは@SpringBootApplication注釈クラスを使用することはできません。 –