私はSpringを使用して、PropertyDefiner実装にクラスを挿入しています。このクラスは、logback.xmlファイル内のいくつかのプロパティの設定を支援するために使用されます(動的プロパティの読み込みを介して)。
ログバックを構成する前に、このクラスをロードしてインスタンス化したいと思います。これを行う方法について何か考えはありますか?
私はSpringを使用して、PropertyDefiner実装にクラスを挿入しています。このクラスは、logback.xmlファイル内のいくつかのプロパティの設定を支援するために使用されます(動的プロパティの読み込みを介して)。
ログバックを構成する前に、このクラスをロードしてインスタンス化したいと思います。これを行う方法について何か考えはありますか?
Springでアノテーションを使用している場合は、注入するクラス(つまり依存関係)を@Componentとしてマークし、PropertyDefiner実装で@Autowiredを使用することでこれを行うと便利です。これにより、最初のクラスが最初にインスタンス化されます。http://static.springsource.org/spring/docs/3.0.0.M3/spring-framework-reference/html/ch04s12.html
必要なその他の初期化は、インスタンス初期化ブロックhttp://docs.oracle.com/javase/tutorial/java/javaOO/initial.htmlを使用して実現できます。
現時点(2012-07)でこれがエレガントにできるかどうかはわかりません。ただし、LOGBACK-719でインジェクションのサポートが要求されています。
BeanファクトリがAutowireCapableBeanFactoryを実装している場合、Spring Applicatonコンテキストが与えられると、autowireBean(オブジェクトexistingBean)を呼び出してBeanを自動配線できます。暫定的な実装は次のとおりです。
class Your.PropertyDefiner implements PropertyDefiner, LifeCycle {
@Autowired
@Qualifier("myKey")
String myKey;
public void start() {
ApplicationContext appContext = ... somehow get the spring app context
AutowireCapableBeanFactory factory = appContext.getAutowireCapableBeanFactory();
factory.autowireBean(this); // declare victory
}
}
このメソッドは、PropertyDefinerがLifeCycleインターフェースをstart()
実装している場合にのみ呼び出されます。さらに、ログバックバージョン1.0.7以降が必要です。以前のバージョンはを呼び出しません。start()
私のソリューションでは、PropertyDefinerを実装していませんでした。元の質問は、動的プロパティを設定するためのアプリケーションコンテキストが春からないという問題になりました。理由はわかりませんが、アプリケーションコンテキストが使用可能になる前に、後のリスナー(Springリスナーの後)のコードが呼び出されます(LoggerFactory呼び出しが呼び出されます)。別のアプローチを検討し始めるまで、私はいくつかのことを試みました。
動的プロパティを使用する代わりに、リスナーを作成し(サーバーの起動時に呼び出されます)、リスナーはプログラムで必要なプロパティを使用してアペンダーをセットアップします(createAdminNotifyAppenderを使用)。
@Override
public void contextInitialized(ServletContextEvent arg0)
{
//Set up the property reader to pull the correct properties
ServletContext context = arg0.getServletContext();
ApplicationContext appContext = WebApplicationContextUtils.getWebApplicationContext(context);
propReader = (AppConfigPropertiesReader)appContext.getBean("propertySourcesPlaceholder");
LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
createAdminNotifyAppender(lc, propReader);
}
createAdminNotifyメソッドは、単にアペンダーを設定し、それをロギングコンテキストに追加します。(本当に興味がある場合は、このスレッドでそのメソッドの実装を確認できます)。
これで、ログバックを使用しているが、おそらく異なるプロパティを持つ他のアプリに追加できる、別個のモジュラーリスナーができました。プロパティはデータベースから取得され、環境によっても異なる場合があります。