Java 如何在GUI阶段1静态绑定期间启动Log4j记录器

Java 如何在GUI阶段1静态绑定期间启动Log4j记录器,java,dependency-injection,testng,guice,log4j2,Java,Dependency Injection,Testng,Guice,Log4j2,我有一个数据库JDBC连接类和一个设置类,该类通过读取配置文件来加载用户名、密码、数据库主机等详细信息和许多其他属性。数据库类依赖于Setup类,因此我使用guicedi进行测试 @Guice(module = DBModule.class) public class MyTest { @Inject DatabaseConn dbconn } 以及数据库连接类,它取决于我的设置类 @Guice(module = Setup.class) public class DatabaseC

我有一个
数据库JDBC连接
类和一个
设置
类,该类通过读取配置文件来加载用户名、密码、数据库主机等详细信息和许多其他属性。数据库类依赖于Setup类,因此我使用guicedi进行测试

@Guice(module = DBModule.class)
public class MyTest {

    @Inject DatabaseConn dbconn
}
以及数据库连接类,它取决于我的设置类

@Guice(module = Setup.class)
public class DatabaseConn {

    @Inject Setup setupInstance.
}
PS:testng框架中使用了
@Guice
注释。更多细节

创建Setup类实例后,我需要加载配置属性(不使用
名称.bindproperties()
),执行一些先决条件以断言某些属性存在,并尝试从环境变量、系统属性等或任何其他源解析其值,基于我们的框架

import com.google.inject.*
import org.apache.logging.log4j.LogManager
import org.apache.logging.log4j.Logger
import aaa.bbb.ccc.Setup

public class SetupModule implements Module {

    private static Logger logger = LogManager.getLogger(SetupModule);

    @Override
    void configure(Binder binder){}

    @Provides @Singleton
    Setup getSetupProperties(){
        System.out.println("DEBUG : Loading setup properties")
        logger.info("Loading setup properties")
        Setup s = new Setup();

        logger.info("Loads the properties from configuration file.");
        s.loadProperties();

        logger.info("Verifies certain mandatory properties");
        s.performPrerequisites();

        logger.info("Resolve values from env. and system if required.");
        s.resolveValues();

        System.out.println("DEBUG : Done")
        return s
    }
}
然而,这个设置类使用Log4j记录器,我想记录我正在使用Log4j记录器进行的额外处理(加载、断言、解析)


我已经按照这里的建议实现了log4j监听器等 但是logger的实例是在Guice注入的第2阶段创建的。i、 e.如果您查看示例代码,getSetupProperties()在GUI阶段1中初始化,因此log4j logger实例在此之前不会实例化

为了证明-我在member injector类的injectMembers方法中添加了sysout

@Override
void injectMembers(T instance) {
    try {
        System.out.println("DEBUG : Setting instance of logger")
        field.set(instance, logger)
    } catch (IllegalAccessException e) {
        throw new RuntimeException(e)
    }
}
因此,当我运行时,我在屏幕上看到以下内容

DEBUG : Loading setup properties
DEBUG : Done
DEBUG : Setting instance of logger
因此,getSetupProperties方法中的任何内容都不会记录到我的log4j日志文件中


我的数据库连接类使用
@注入设置设置属性
而上述工作。但是由于缺乏日志记录,我无法在出现问题时调试任何东西

因此,我需要一些机制,在Guice阶段1期间实例化我的log4j记录器

这个问题也更一般-即,对于存在链式依赖项的情况,并且在第二个依赖项消耗第一个实例之前,需要进行某些额外的处理。如何确保我们的记录器可用于这些处理方法

Guice定义了3个阶段。更多细节

如果任何人有一个直接的解决方案,或者可能有一个解决方案,请感谢任何意见

PS:考虑到由于组织政策的原因,我无法透露具体的实施情况,我已经尝试给出问题的快照


谢谢。

你能解释一下“第一阶段”和“第二阶段”是什么意思吗?这些术语并不明确,Guice的文档中也没有这些术语。此外,您的记录器是否正确配置?因为从您显示的代码中,应该打印出语句,Guice或no Guice@OlivierGrégoire-有3个阶段-静态构建、注入、单体预加载-这里提到。您是对的,无论是否使用Guice,在Guice注入完成后发生的任何事情都可以立即进行日志记录。。。但是我希望日志记录也发生在那些
@提供的
配置
方法中,这些方法都是特定于Guice的。希望澄清。我的错,我搜索了,但找不到那些相位项。我的意思是记录器是静态的。因此,无论发生什么,它都应该起作用,而不是有条件地起作用。除非您在Guice中的某个地方手动配置了SLF4J。如果是这种情况,您应该在创建Guice模块之前提取手动配置并移动它。您在上面的评论证实了这一点。默认情况下,我没有任何手动配置-我在我的
src/test/resources/log4j2.json
下放置了一个
log4j2.json
,它可以很好地用于所有日志写入,发生在guice注入完成之后。上面的日志监听器(或手动配置)只是另一种尝试,以确保在Guice启动之前实例化log4j2,但这并没有发生。您能解释一下“阶段1”和“阶段2”是什么意思吗?这些术语并不明确,Guice的文档中也没有这些术语。此外,您的记录器是否正确配置?因为从您显示的代码中,应该打印出语句,Guice或no Guice@OlivierGrégoire-有3个阶段-静态构建、注入、单体预加载-这里提到。您是对的,无论是否使用Guice,在Guice注入完成后发生的任何事情都可以立即进行日志记录。。。但是我希望日志记录也发生在那些
@提供的
配置
方法中,这些方法都是特定于Guice的。希望澄清。我的错,我搜索了,但找不到那些相位项。我的意思是记录器是静态的。因此,无论发生什么,它都应该起作用,而不是有条件地起作用。除非您在Guice中的某个地方手动配置了SLF4J。如果是这种情况,您应该在创建Guice模块之前提取手动配置并移动它。您在上面的评论证实了这一点。默认情况下,我没有任何手动配置-我在我的
src/test/resources/log4j2.json
下放置了一个
log4j2.json
,它可以很好地用于所有日志写入,发生在guice注入完成之后。上面的日志侦听器(或手动配置)只是另一种尝试,以确保在Guice启动之前实例化log4j2,但这并没有发生。