我有一个示例Spring Boot应用程序,它使用Logback进行日志记录。所以我在jar旁边有logback-spring.xml
来配置日志记录,但是除非我用logging.config
,例如:logging.config=logback-spring.xml
指定它,否则它不起作用。
我已经调查了Spring Boot ignoring logback-spring.xml,它表明它可能是因为某个地方已经存在spring.xml
,但是在org.springframework.boot.logging.AbstractLoggingSystem.initializeWithConventions(LoggingInitializationContext, LogFile)
上设置断点显示logFile是空的。
我在这里做错了吗?
默认情况下,Spring不会查找jar文件之外的资源。如果要使用外部logback配置文件,则必须在启动jar时传递它的位置:
$ java -jar -Dlogback.configurationFile=/full_path/logback.xml app.jar
请不要将logback.xml包含到最终的Jar文件中,它会在类路径中导致多个logback.xml文件。
根据问题的描述,您使用的是日志配置的外化版本。该文件保存在jar外面。所以你必须提到路径作为运行时参数如下:
-Dlogging.config=file:logback-spring.xml
或者在application.properties中提及相同的属性,如下所示:
logging.config=file:logback-spring.xml
它从资源文件夹中获取文件的原因,因为它以spring的方式配置。 Spring通过classpath中的以下名称获取logback文件。
logback-spring.xml, logback-spring.groovy, logback.xml, or logback.groovy
这种行为可能有两个原因:
原因1:logback-spring.xml在某种程度上不在类路径中。您可以在运行时通过打印System.getProperty("java.class.path")
并检查输出中是否存在包含logback-spring.xml的文件夹来验证这一点。
原因2:如果原因1不是问题,那么类路径中已经存在名为logback.xml或logback-spring.xml的文件,这可能会导致冲突。现在,你必须找到该文件。您可以尝试将logback-spring.xml重命名为logback.xml并检查行为。
只需在logback-spring.xml中定义这些行
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/base.xml"/>
<logger name="org.springframework.web" level="DEBUG"/>
</configuration>
我不知道为什么它不适合你。我在资源文件夹中创建了一个logback-spring.xml文件,它运行正常。
以下是日志文件的内容:
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true">
<include resource="org/springframework/boot/logging/logback/base.xml"/>
<property name="LOGDIR" value="logs"></property>
<property name="APP_NAME" value="spring-boot-sample"></property>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>%d ${APP_NAME} %-5level [%thread] %logger: %msg%n</Pattern>
</layout>
</appender>
<appender name="ROLLINGFILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOGDIR}/${APP_NAME}-log.%d{MM-dd-yyyy}.log</fileNamePattern>
<maxHistory>90</maxHistory>
</rollingPolicy>
<encoder>
<charset>utf-8</charset>
<Pattern>%d ${APP_NAME} %-5level [%thread] %logger: %msg%n</Pattern>
</encoder>
</appender>
<springProfile name="local">
<root level="debug">
<appender-ref ref="CONSOLE"/>
</root>
<logger name="co.jp.oha" additivity="false" level="debug">
<appender-ref ref="ROLLINGFILE"/>
<appender-ref ref="STDOUT"/>
</logger>
</springProfile>
</configuration>
你可以尝试一下。我希望它会对你有所帮助。