我们希望在Spring Boot2.4.x中从标准logback切换到log4j。对于大多数模块来说,通过简单地删除logback的依赖项是很容易的,但也有一些模块使用pact-jvm作为影子jar依赖项,以便能够从单元测试创建pact文件。
现在,奥德赛开始了,因为pact需要logback,并且在类路径上使用pact-jar,Spring识别出它正在寻找的logback类,并决定在测试中使用logback而不是log4j作为记录器。
有没有可能创建像log bean或隐藏配置这样的东西,允许强制Spring使用log4j而不是logback,如果logback在类路径上?
Pact在这一点上应该不是问题,因为服务器是作为gradle的独立服务器启动的。我们只需要依赖项就能启动所有东西,并让类可用。
谢谢!
发布于 2021-06-30 22:37:10
您可以按照以下步骤使用spring boot配置log4j
org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger(<YourClassName>.class);spring boot模块/项目中的
的示例内容
log4j.rootLogger=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n在构建时,请确保弹簧引导模块捆绑了log4j jar。
一旦spring boot在类路径上找到了log4j jar和log4j.properties,它就能够为您初始化log4j记录器。
发布于 2021-06-30 23:17:39
是的,这是很清楚的。问题是,Spring Boot自动配置正在加载slf4j的记录器(对不起,忘了这一点)。因此,它在这里按顺序迭代支持的候选对象:
而且它似乎并不查找bean,它只是通过反射查找类。
如果我们现在与pact服务器一起启动应用程序进行测试,Spring Boot会解析一个Append*类,并认为这必须是我们选择的记录器。它创建logback实例,该实例正在搜索其配置,但随后它失败了,因为该配置是用于log4j的。
https://stackoverflow.com/questions/68196287
复制相似问题