我在maven多模块项目中有一个SpringBoot应用程序,我使用Log4j2进行日志记录。
当我使用测试运行构建时,一些模块有一个奇怪的日志记录异常,并记录来自未知(不是我的)类的更多行。
这是一个例外:
2018-06-04 14:16:26,791 main ERROR Error creating converter for xwEx java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.logging.log4j.core.pattern.PatternParser.createConverter(PatternParser.java:583)
at org.apache.logging.log4j.core.pattern.PatternParser.finalizeConverter(PatternParser.java:639)
at org.apache.logging.log4j.core.pattern.PatternParser.parse(PatternParser.java:415)
at org.apache.logging.log4j.core.pattern.PatternParser.parse(PatternParser.java:177)
at org.apache.logging.log4j.core.layout.PatternLayout$SerializerBuilder.build(PatternLayout.java:377)
at org.apache.logging.log4j.core.layout.PatternLayout.<init>(PatternLayout.java:129)
at org.apache.logging.log4j.core.layout.PatternLayout.<init>(PatternLayout.java:59)
at org.apache.logging.log4j.core.layout.PatternLayout$Builder.build(PatternLayout.java:660)
at org.apache.logging.log4j.core.layout.PatternLayout$Builder.build(PatternLayout.java:517)
at org.apache.logging.log4j.core.config.plugins.util.PluginBuilder.build(PluginBuilder.java:122)
at org.apache.logging.log4j.core.config.AbstractConfiguration.createPluginObject(AbstractConfiguration.java:958)
at org.apache.logging.log4j.core.config.AbstractConfiguration.createConfiguration(AbstractConfiguration.java:898)
at org.apache.logging.log4j.core.config.AbstractConfiguration.createConfiguration(AbstractConfiguration.java:890)
at org.apache.logging.log4j.core.config.AbstractConfiguration.createConfiguration(AbstractConfiguration.java:890)
at org.apache.logging.log4j.core.config.AbstractConfiguration.doConfigure(AbstractConfiguration.java:513)
at org.apache.logging.log4j.core.config.AbstractConfiguration.initialize(AbstractConfiguration.java:237)
at org.apache.logging.log4j.core.config.AbstractConfiguration.start(AbstractConfiguration.java:249)
at org.apache.logging.log4j.core.LoggerContext.setConfiguration(LoggerContext.java:545)
at org.apache.logging.log4j.core.LoggerContext.start(LoggerContext.java:261)
at org.springframework.boot.logging.log4j2.Log4J2LoggingSystem.loadConfiguration(Log4J2LoggingSystem.java:176)
at org.springframework.boot.logging.log4j2.Log4J2LoggingSystem.loadDefaults(Log4J2LoggingSystem.java:159)
at org.springframework.boot.logging.AbstractLoggingSystem.initializeWithConventions(AbstractLoggingSystem.java:84)
at org.springframework.boot.logging.AbstractLoggingSystem.initialize(AbstractLoggingSystem.java:59)
at org.springframework.boot.logging.log4j2.Log4J2LoggingSystem.initialize(Log4J2LoggingSystem.java:148)
at org.springframework.boot.logging.LoggingApplicationListener.initializeSystem(LoggingApplicationListener.java:303)
at org.springframework.boot.logging.LoggingApplicationListener.initialize(LoggingApplicationListener.java:276)
at org.springframework.boot.logging.LoggingApplicationListener.onApplicationEnvironmentPreparedEvent(LoggingApplicationListener.java:239)
at org.springframework.boot.logging.LoggingApplicationListener.onApplicationEvent(LoggingApplicationListener.java:212)
at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:167)
at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139)
at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:122)
at org.springframework.boot.context.event.EventPublishingRunListener.environmentPrepared(EventPublishingRunListener.java:73)
at org.springframework.boot.SpringApplicationRunListeners.environmentPrepared(SpringApplicationRunListeners.java:54)
at org.springframework.boot.SpringApplication.prepareEnvironment(SpringApplication.java:336)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:307)
at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:120)
at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:98)
at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:116)
at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:83)
at org.springframework.test.context.web.ServletTestExecutionListener.setUpRequestContextIfNecessary(ServletTestExecutionListener.java:189)
at org.springframework.test.context.web.ServletTestExecutionListener.prepareTestInstance(ServletTestExecutionListener.java:131)
at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:230)
at org.spockframework.spring.SpringTestContextManager.prepareTestInstance(SpringTestContextManager.java:50)
at org.spockframework.spring.SpringInterceptor.interceptSetupMethod(SpringInterceptor.java:42)
at org.spockframework.runtime.extension.AbstractMethodInterceptor.intercept(AbstractMethodInterceptor.java:28)
at org.spockframework.runtime.extension.MethodInvocation.proceed(MethodInvocation.java:87)
at org.spockframework.runtime.BaseSpecRunner.invoke(BaseSpecRunner.java:472)
at org.spockframework.runtime.BaseSpecRunner.runSetup(BaseSpecRunner.java:375)
at org.spockframework.runtime.BaseSpecRunner.runSetup(BaseSpecRunner.java:370)
at org.spockframework.runtime.BaseSpecRunner.doRunIteration(BaseSpecRunner.java:323)
at org.spockframework.runtime.BaseSpecRunner$6.invoke(BaseSpecRunner.java:309)
at org.spockframework.runtime.BaseSpecRunner.invokeRaw(BaseSpecRunner.java:481)
at org.spockframework.runtime.BaseSpecRunner.invoke(BaseSpecRunner.java:464)
at org.spockframework.runtime.BaseSpecRunner.runIteration(BaseSpecRunner.java:288)
at org.spockframework.runtime.BaseSpecRunner.initializeAndRunIteration(BaseSpecRunner.java:278)
at org.spockframework.runtime.BaseSpecRunner.runSimpleFeature(BaseSpecRunner.java:269)
at org.spockframework.runtime.BaseSpecRunner.doRunFeature(BaseSpecRunner.java:263)
at org.spockframework.runtime.BaseSpecRunner$5.invoke(BaseSpecRunner.java:246)
at org.spockframework.runtime.BaseSpecRunner.invokeRaw(BaseSpecRunner.java:481)
at org.spockframework.runtime.BaseSpecRunner.invoke(BaseSpecRunner.java:464)
at org.spockframework.runtime.BaseSpecRunner.runFeature(BaseSpecRunner.java:238)
at org.spockframework.runtime.BaseSpecRunner.runFeatures(BaseSpecRunner.java:188)
at org.spockframework.runtime.BaseSpecRunner.doRunSpec(BaseSpecRunner.java:98)
at org.spockframework.runtime.BaseSpecRunner$1.invoke(BaseSpecRunner.java:84)
at org.spockframework.runtime.BaseSpecRunner.invokeRaw(BaseSpecRunner.java:481)
at org.spockframework.runtime.BaseSpecRunner.invoke(BaseSpecRunner.java:464)
at org.spockframework.runtime.BaseSpecRunner.runSpec(BaseSpecRunner.java:76)
at org.spockframework.runtime.BaseSpecRunner.run(BaseSpecRunner.java:67)
at org.spockframework.runtime.Sputnik.run(Sputnik.java:63)
at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:283)
at org.apache.maven.surefire.junit4.JUnit4Provider.executeWithRerun(JUnit4Provider.java:173)
at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:153)
at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:128)
at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:203)
at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:155)
at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:103)
Caused by: java.lang.NoSuchMethodError: org.apache.logging.log4j.core.pattern.ThrowablePatternConverter.<init>(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;)V
at org.springframework.boot.logging.log4j2.ExtendedWhitespaceThrowablePatternConverter.<init>(ExtendedWhitespaceThrowablePatternConverter.java:42)
at org.springframework.boot.logging.log4j2.ExtendedWhitespaceThrowablePatternConverter.newInstance(ExtendedWhitespaceThrowablePatternConverter.java:63)
... 80 more
然后我得到这一行:
2018-06-04 14:16:26,805 main ERROR Unrecognized conversion specifier [xwEx] starting at position 160 in conversion pattern.
然后我看到未知的日志(关于我班级的前两行):
2018-06-04 14:16:27.118 INFO 1244 --- [ main] c.m.a.MyTest : Starting MyTest on blablabla
%xwEx2018-06-04 14:16:27.148 INFO 1244 --- [ main] c.m.a.MyTest : No active profile set, falling back to default profiles: default
%xwEx2018-06-04 14:16:27.298 INFO 1244 --- [ main] o.s.w.c.s.GenericWebApplicationContext : Refreshing org.springframework.web.context.support.GenericWebApplicationContext@51a07eac: startup date [Mon Jun 04 14:16:27 CEST 2018]; root of context hierarchy
%xwEx2018-06-04 14:16:31.216 INFO 1244 --- [ main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration' of type [class org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
%xwEx2018-06-04 14:16:32.022 INFO 1244 --- [ main] trationDelegate$BeanPostProcessorChecker : Bean 'validator' of type [class org.springframework.validation.beanvalidation.LocalValidatorFactoryBean] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
%xwEx2018-06-04 14:16:32.423 INFO 1244 --- [ main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration' of type [class org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration$$EnhancerBySpringCGLIB$$a851eb8b] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
%xwEx2018-06-04 14:16:36.988 INFO 1244 --- [ main] o.s.a.f.CglibAopProxy : Unable to proxy method [protected final int com.globalblue.refunding.repository.scheduler.SchedulerBaseRepository.doInClauseUpdateWithoutAffectedRowsCheck(java.lang.String,java.lang.String,java.util.List)] because it is final: All calls to this method via a proxy will NOT be routed to the target instance.
%xwEx2018-06-04 14:16:36.997 INFO 1244 --- [ main] o.s.a.f.CglibAopProxy : Unable to proxy method [protected final int com.globalblue.refunding.repository.scheduler.SchedulerBaseRepository.doInClauseUpdateWithAffectedRowsCheck(java.lang.String,java.lang.String,java.util.List)] because it is final: All calls to this method via a proxy will NOT be routed to the target instance.
%xwEx2018-06-04 14:16:36.998 INFO 1244 --- [ main] o.s.a.f.CglibAopProxy : Unable to proxy method [protected final int com.globalblue.refunding.repository.scheduler.SchedulerBaseRepository.doInClauseUpdate(java.lang.String,java.lang.String,java.util.List,boolean)] because it is final: All calls to this method via a proxy will NOT be routed to the target instance.
%xwEx2018-06-04 14:16:37.567 INFO 1244 --- [ main] o.s.a.f.CglibAopProxy : Unable to proxy method [protected final int com.globalblue.refunding.repository.scheduler.SchedulerBaseRepository.doInClauseUpdateWithoutAffectedRowsCheck(java.lang.String,java.lang.String,java.util.List)] because it is final: All calls to this method via a proxy will NOT be routed to the target instance.
%xwEx2018-06-04 14:16:37.568 INFO 1244 --- [ main] o.s.a.f.CglibAopProxy : Unable to proxy method [protected final int com.globalblue.refunding.repository.scheduler.SchedulerBaseRepository.doInClauseUpdateWithAffectedRowsCheck(java.lang.String,java.lang.String,java.util.List)] because it is final: All calls to this method via a proxy will NOT be routed to the target instance.
%xwEx2018-06-04 14:16:37.569 INFO 1244 --- [ main] o.s.a.f.CglibAopProxy : Unable to proxy method [protected final int com.globalblue.refunding.repository.scheduler.SchedulerBaseRepository.doInClauseUpdate(java.lang.String,java.lang.String,java.util.List,boolean)] because it is final: All calls to this method via a proxy will NOT be routed to the target instance.
这是我在模块中的log4j2-test.xml,我得到了这些奇怪的东西:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
<Appenders>
<Console name="stdout">
<PatternLayout pattern="MyApp: %d{yyyy-MM-dd HH:mm:ss,SSS} %5p [%t] %c{1.}:%L - %m%n"/>
</Console>
</Appenders>
<Loggers>
<Logger name="com.my.app" level="debug" additivity="false">
<appender-ref ref="stdout"/>
</Logger>
<Logger name="org.springframework" level="warn" additivity="false">
<Appender-ref ref="stdout"/>
</Logger>
<Logger name="org.springframework.context.annotation.ConfigurationClassEnhancer" level="error"
additivity="false">
<Appender-ref ref="stdout"/>
</Logger>
<Root level="info">
<Appender-ref ref="stdout"/>
</Root>
</Loggers>
</Configuration>
最后是模块的pom.xml:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
</dependency>
<!-- Log4j Start -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-web</artifactId>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-jul</artifactId>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-jcl</artifactId>
</dependency>
<dependency>
<groupId>org.dblock.log4jna</groupId>
<artifactId>log4jna-api</artifactId>
</dependency>
答案 0 :(得分:1)
有一个问题报告说Spring Boot 1.5与Log4j 2.8不兼容。 https://github.com/spring-projects/spring-boot/issues/9172
我在使用Spring Boot 1.5和Log4j 2.8.2时遇到了像您一样的错误,而当我切换到Log4j 2.7时,这些错误消失了
答案 1 :(得分:0)
尝试修改您的log4j2-test.xml文件以匹配以下内容:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration name="${sys:LOG_FILE}" status="WARN"
strict="true">
<Properties>
<Property name="ROLLING_LOG_FILE_NAME"
value="${sys:LOG_FILE}" />
<Property name="APP_LOG_FOLDER"
value="${ROLLING_LOG_FILE_NAME}" />
<Property name="APP_LOG_BASE_DIRECTORY"
value="${sys:dtep.logs.home}${sys:file.separator}${APP_LOG_FOLDER}" />
<Property name="CONSOLE_LOG_PATTERN"
value="%date{yyyy-MM-dd HH:mm:ss.SSS} %highlight{%5level} %style{%5processId}{normal, blue} --- [%15thread] %style{%logger{1.}}{normal, cyan} : %message%n%throwable%n" />
<Property name="FILE_LOG_PATTERN"
value="%date{yyyy-MM-dd HH:mm:ss.SSS} %5level %5processId --- [%15thread] %logger{1.} : %message%n%throwable%n" />
</Properties>
<Appenders>
<Appender type="Console" name="Console" target="SYSTEM_OUT">
<Layout type="PatternLayout" pattern="${CONSOLE_LOG_PATTERN}" />
</Appender>
<Appender type="RollingFile" name="RollingFile"
fileName="${APP_LOG_BASE_DIRECTORY}${sys:file.separator}${ROLLING_LOG_FILE_NAME}.log"
filePattern="${APP_LOG_BASE_DIRECTORY}${sys:file.separator}$${date:yyyy}${sys:file.separator}$${date:MMM}${sys:file.separator}${ROLLING_LOG_FILE_NAME}_%d{yyyy-MM-dd}_%i.log">
<Layout type="PatternLayout" pattern="${FILE_LOG_PATTERN}" />
<Policies>
<Policy type="TimeBasedTriggeringPolicy" />
<Policy type="SizeBasedTriggeringPolicy" size="1KB" />
</Policies>
<Strategy type="DefaultRolloverStrategy" fileIndex="nomax">
<Delete basePath="${APP_LOG_BASE_DIRECTORY}" maxDepth="5"
testMode="false">
<IfFileName
glob="**${sys:file.separator}${ROLLING_LOG_FILE_NAME}_*.log">
<IfLastModified age="1m">
<IfAny>
<IfAccumulatedFileSize exceeds="3 KB" />
<IfAccumulatedFileCount exceeds="3" />
</IfAny>
</IfLastModified>
</IfFileName>
</Delete>
</Strategy>
</Appender>
</Appenders>
<Loggers>
<Root level="TRACE">
<AppenderRef ref="Console">
<Filters>
<Filter type="ThresholdFilter" level="INFO" onMatch="ACCEPT"
onMismatch="DENY" />
</Filters>
</AppenderRef>
<AppenderRef ref="RollingFile">
<Filters>
<Filter type="ThresholdFilter" level="INFO" onMatch="ACCEPT"
onMismatch="DENY" />
</Filters>
</AppenderRef>
</Root>
<AsyncLogger name="org.springframework" level="INFO"
additivity="false">
<AppenderRef ref="Console" />
<AppenderRef ref="RollingFile" />
</AsyncLogger>
<AsyncLogger name="org.hibernate" level="INFO"
additivity="false">
<AppenderRef ref="Console" />
<AppenderRef ref="RollingFile" />
</AsyncLogger>
</Loggers>
</Configuration>