Spring Boot 和 Log4J2 的奇怪行为

运行 Spring Boot 应用程序时,我遇到了一些奇怪的问题。它已配置为使用 Log4J2 作为其记录器(Logback 记录器已被禁用)。


log4j2.xml:


<Configuration status="WARN" monitorInterval="30">

  <Properties>

    <Property name="serviceName">$${sys:service.name}</Property>

    <Property name="serviceId">$${sys:service.id}</Property>


    <Property name="LOG_PATTERN">

      [%d{yyyy-MM-dd HH:mm:ss.SSS}] %t %-5p: %c{2}:%L - %m%n

    </Property>


运行 Spring Boot 应用程序时,我遇到了一些奇怪的问题。它已配置为使用 Log4J2 作为其记录器(Logback 记录器已被禁用)。


log4j2.xml:


<Configuration status="WARN" monitorInterval="30">

  <Properties>

    <Property name="serviceName">$${sys:service.name}</Property>

    <Property name="serviceId">$${sys:service.id}</Property>


    <Property name="LOG_PATTERN">

      [%d{yyyy-MM-dd HH:mm:ss.SSS}] %t %-5p: %c{2}:%L - %m%n

    </Property>


    <Property name="STATS_PATTERN">

      %m%n

    </Property>


    <Property name="logFile">logs/$${sys:service.name}-$${sys:service.id}</Property>

    <Property name="statsFile">metrics/$${sys:service.name}-$${sys:service.id}_stats.json</Property>

    <!--

    <Property name="logFile">logs/${serviceName}-${serviceId}</Property>

    <Property name="statsFile">metrics/${serviceName}-${serviceId}_stats.json</Property>

    -->

  </Properties>


  <Appenders>

    <Console name="ConsoleAppender" target="SYSTEM_OUT" follow="true">

      <PatternLayout pattern="${LOG_PATTERN}" />

    </Console>


    <RollingFile name="RollingFile" fileName="${logFile}.current-session.log"

      filePattern="${logFile}.%i.log.gz" ignoreExceptions="false">

      <PatternLayout>

        <Pattern>${LOG_PATTERN}</Pattern>

      </PatternLayout>

      <Policies>

        <OnStartupTriggeringPolicy />

        <SizeBasedTriggeringPolicy size="10 MB" />

      </Policies>

      <DefaultRolloverStrategy max="10" />

    </RollingFile>


    <File name="StatsFile" fileName="${statsFile}" append="false">

      <PatternLayout>

        <Pattern>${STATS_PATTERN}</Pattern>

      </PatternLayout>



Smart猫小萌
浏览 99回答 1
1回答

慕田峪7331174

对于您的主要问题log4j2.xml,您应该使用您的文件名,log4j2-spring.xml因为这样您就可以让 Spring Boot 更好地控制 Log4j2。好处之一是可以整合您缺少的变量。这可能是由于使用log4j2.xml文件使得log4j2在spring boot之前初始化,而使用log4j2-spring.xmlmakes Spring Boot来初始化log4j2。正如SpringBoot 文档所述:如果可能,我们建议您使用 -spring 变体进行日志记录配置(例如,logback-spring.xml 而不是 logback.xml)。如果使用标准配置位置,Spring 无法完全控制日志初始化。对于你的第二个问题,因为你有 2 个记录器......简单地说: <Loggers>    <Logger name="<package>.StatsWriter" level="info" additivity="false">      <AppenderRef ref="StatsFile" />   <---- This one creates your file    </Logger>    <Root level="info">      <AppenderRef ref="ConsoleAppender" />    </Root>  </Loggers>关于你的第三个问题:我对 application-"profile".yml 和 log4j2-spring.xml 的引用有点困惑。我不熟悉这些文件名的这些变体。这些变化(两种文件类型)的意义是什么?它的变体application-"profile".xxx是允许 Spring Boot 根据这些配置文件采取不同配置的一种方式。您可以使用“dev”参数(本地开发数据库)启动应用程序,但在生产中您可以使用不同的参数。您可以控制如何通过不同的方式引导不同的配置文件,一种非常常见的方式是执行您的应用程序,例如java -jar -Dspring.profiles.active=prod application.jar与 相关log4j2-spring.xml,如上所述,允许 Spring Boot 正确初始化 log4j2 (或您使用的任何日志记录工具)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java