spring - 从日志附加器类访问 spring bean

标签 spring log4j

我有 log4j DailyRollingFileAppender 类,其中 setFile() 方法我需要检查数据库值来决定使用哪个文件进行日志记录。

DailyRollingFileAppender class 

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

这里的“authenticationManager”是用于使用 Spring 依赖注入(inject)功能进行数据库调用的类的对象。

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();”来自 DailyFileAppender 类,以便当 log4j 加载时它应该能够获取数据库值?

最佳答案

晚了几年,但我希望这对某人有帮助。

我追求类似的功能 - 我有一个自定义附加程序,并且我想使用 Autowiring 的 bean 来使用我们构建的服务执行一些日志记录。通过使appender实现ApplicationContextAware接口(interface),并使我通常 Autowiring 的字段成为静态,我能够将spring控制的bean注入(inject)到log4j已实例化的appender实例中。

@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");
        }
    }
}

关于spring - 从日志附加器类访问 spring bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12275171/

相关文章:

java - spring-boot-devtools 在缺少 MANIFEST.MF 的 JAR 上失败

log4j - 如何使用 log4j.xml 配置 log4j 以根据类名附加到不同的日志文件?

java - 将日志记录添加到实用程序包

spring - 无法连接到 10.XX.XX.28 :6379: Unknown error - while accessing from Spring Batch or windows machine 处的 Redis

java - 野飞多数据源

spring - 导入就地插件的Grails应用程序上下文

log4j - weblogic 中具有多个 log4j.xml 的多个应用程序

java - 整个程序的记录器打印消息两次,有时甚至打印更多次

java - Log4j:如何配置最简单的文件日志记录?

spring - 下载文本/html文件时如何防止servlet响应编码? Spring +JSF