独立tomcat中的Spring Boot日志文件以XML格式保存

Posted

技术标签:

【中文标题】独立tomcat中的Spring Boot日志文件以XML格式保存【英文标题】:Spring Boot log files in standalone tomcat are saved in XML format 【发布时间】:2018-12-16 14:36:01 【问题描述】:

所以我一直想知道为什么独立模式下的tomcat 会以XML 格式保存日志文件。当我在嵌入的 Tomcat 中部署 Spring Boot 应用程序时,这并没有发生。我正在使用 logback-spring.xml 来配置日志。即使我禁用它,Tomcat 仍然以 XML 格式保存它。我什至试图覆盖位于$CATALINA_HOME/conf 中的tomcats logging.properties 文件。

这是我得到的 XML 输出:

<record>
   <date>2018-07-08T22:35:25</date>
   <millis>1531089325236</millis>
   <sequence>325</sequence>
   <logger>org.apache.catalina.startup.Catalina</logger>
   <level>INFO</level>
   <class>org.apache.catalina.startup.Catalina</class>
   <method>start</method>
   <thread>1</thread>
   <message>Server startup in 11151 ms</message>
</record>

这是我在application.properties中的日志配置:

#logging.config=classpath:/logback-spring.xml
logging.file=/tmp/app.log
logging.file-name=app
logging.archive.path=/var/tmp/app
logging.file.max-size=10MB
logging.file.max-history=30
logging.archive.compressor=gz
logging.pattern.dateformat=yyyy-MM-dd HH:mm:ss.SSS
logging.pattern.file=%ddd-MM-yyyy HH:mm:ss.SSS %magenta([%thread]) %highlight(%-5level) %logger36.%M - %msg%n

logging.level.org.springframework.web=DEBUG
logging.level.org.hibernate=ERROR

这是我的logback-spring.xml 配置:

<?xml version="1.0" encoding="UTF-8"?>

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
        <pattern>
            $FILE_LOG_PATTERN
        </pattern>
    </encoder>
</appender>

<springProperty  name="LOG_ARCHIVE_PATH" source="logging.archive.path" />
<springProperty  name="LOG_FILE_NAME" source="logging.file-name" />
<springProperty  name="LOG_ARCHIVE_COMPRESSOR" source="logging.archive.compressor" />
<springProperty  name="PATTERN" source="logging.pattern.file" />

<appender name="LOGROTATE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>$LOG_FILE</file>

    <encoder>
        <pattern>$PATTERN</pattern>
    </encoder>

    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <cleanHistoryOnStart>true</cleanHistoryOnStart>
        <fileNamePattern>$LOG_ARCHIVE_PATH/$LOG_FILE_NAME.%ddd-MM-yyyy_%i.log.$LOG_ARCHIVE_COMPRESSOR</fileNamePattern>

        <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
            <maxFileSize>$LOG_FILE_MAX_SIZE</maxFileSize>
        </timeBasedFileNamingAndTriggeringPolicy>

        <maxHistory>$LOG_FILE_MAX_HISTORY</maxHistory>

    </rollingPolicy>

</appender>


<springProfile name="dev">
    <root level="INFO">
        <appender-ref ref="STDOUT" />
    </root>
</springProfile>

<springProfile name="prod" >

    <root level="WARN">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="LOGROTATE" />
    </root>

</springProfile>

我很确定,spring 端的配置没问题,因为它在嵌入模式下工作。 Tomcat似乎是罪魁祸首,但我不知道如何解决这个问题。

【问题讨论】:

【参考方案1】:

阅读tomcat documentation 后我发现,如果tomcat 无法解析tomcat logging.properties 文件位置或某些属性,它会退回到Java 的默认日志配置。默认的 java 日志配置位于 $JAVA_HOME/lib/logging.properties 并使用 XMLFormatter 来记录文件日志。 Spring 似乎无法在 Tomcat 的独立模式下处理日志记录配置。我找不到使用 logback 的方法,而是覆盖了 tomcat 日志文件。下面是一个例子:

handlers =java.util.logging.FileHandler,java.util.logging.ConsoleHandler
.level = INFO

# File Logging
java.util.logging.FileHandler.pattern = %h/logfilename%u.log
java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter
java.util.logging.FileHandler.level = INFO
java.util.logging.FileHandler.limit = 10485760
java.util.logging.FileHandler.count = 10

#java.util.logging.ConsoleHandler.formatter = org.springframework.boot.logging.java.SimpleFormatter
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
java.util.logging.ConsoleHandler.level = INFO

org.hibernate.validator.internal.util.Version.level = WARNING
org.apache.coyote.http11.Http11NioProtocol.level = WARNING
org.apache.tomcat.util.net.NioselectorPool.level = WARNING
org.apache.catalina.startup.DigesterFactory.level = SEVERE
org.apache.catalina.util.LifecycleBase.level = SEVERE

#java.util.logging.SimpleFormatter.format=%4$s: %5$s [%1$tc]%n
java.util.logging.SimpleFormatter.format=%ddd-MM-yyyy HH:mm:ss.SSS %magenta([%thread]) %highlight(%-5level) %logger36.%M - %msg%n

另一种选择是将文件登录配置添加到位于$CATALINA_HOME/conf/logging.properties 中的现有logging.properties 文件中:

java.util.logging.FileHandler= java.util.logging.SimpleFormatter

【讨论】:

以上是关于独立tomcat中的Spring Boot日志文件以XML格式保存的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot自定义的Tomcat打印catalina和tomcat日志

spring boot .war tomcat 应用程序日志不存在

Spring Boot - 独立 Tomcat / 外部 logback 文件被忽略

你如何告诉 Spring Boot 将嵌入式 Tomcat 的访问日志发送到标准输出?

Spring Boot中的日志配置

尝试处理 Spring Boot 应用程序中的异常时,日志中出现 ErrorPageFilter 错误