2017-03-03 11 views
0

私は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はこれを最初にインスタンス化してテストできません。私は問題にぶつかるのだろうか?

答えて

0

クラスBが最初にロードされると、 "log4j:WARNロガーのアペンダーが見つかりませんでした"がスローされます。 @SpringBootApplicationアノテートされたクラスでロガーを初期化するか、自動的にロードされるlog4j.propertiesファイルを使用することができます。

+0

現在、最初にロードされていますが、最初にロードすることは保証できません。さらに、ビジネス要件にこの特定のクラスを使用してロードする必要があるため、log4jプロパティファイルまたは@SpringBootApplication注釈クラスを使用することはできません。 –

関連する問題