5

ログに使用するファイルを決定するためにデータベースの値を確認する必要がある setFile() メソッドの log4j DailyRollingFileAppender クラスがあります。

DailyRollingFileAppender class 

public void setFileName()
{
    isLoginEnabled = authenticationManager.checkLoginLogging();
}

ここで、「authenticationManager」は、Spring 依存性注入機能を使用してデータベース呼び出しを行うために使用されるクラスのオブジェクトです。

spring-beans.xml
<bean id="dailyRollingFileAppender" class="com.common.util.DailyRollingFileAppender">
 <property name="authenticationManager">
     <ref bean="authenticationManager"/>
 </property>
</bean>

<bean id="authenticationManager" class="com.security.impl.AuthenticationManagerImpl">
    <property name="userService">
        <ref bean="userService"/>
</property>
</bean>

ここで、アプリケーションを開始すると、log4j が最初に開始され、spring-beans がまだ呼び出されていないため、メソッド setFileName() で NullPointerException がスローされます。「authenticationManager.checkLoginLogging();」を呼び出す方法はありますか Log4jがロードされたときにデータベース値を取得できるように、DailyFileAppenderクラスから?

4

1 に答える 1

12

数年遅れていますが、これが誰かの助けになることを願っています。

私は同様の機能を求めていました-カスタムアペンダーがあり、自動配線されたBeanを使用して、構築したサービスを使用してログを記録したかったのです。アペンダーに ApplicationContextAware インターフェースを実装させ、通常は自動配線するフィールドを静的にすることで、log4j がインスタンス化したアペンダーのインスタンスにスプリング制御の Bean を注入できます。

@Component
public class SslErrorSecurityAppender extends AppenderSkeleton implements ApplicationContextAware {

    private static SecurityLogger securityLogger;

    @Override
    protected void append(LoggingEvent event) {
        securityLogger.log(new SslExceptionSecurityEvent(SecurityEventType.AUTHENTICATION_FAILED, event.getThrowableInformation().getThrowable(), "Unexpected SSL error"));
    }

    @Override
    public boolean requiresLayout() {
        return false;
    }

    @Override
    public synchronized void close() {
        this.closed = true;
    }


    @Override
    public void setApplicationContext(ApplicationContext applicationContext) {
        if (applicationContext.getAutowireCapableBeanFactory().getBean("securityLogger") != null) {
            securityLogger = (SecurityLogger) applicationContext.getAutowireCapableBeanFactory().getBean("securityLogger");
        }
    }
}
于 2015-06-01T23:58:29.490 に答える