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

<!-- 级别从高到低 OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!-- 日志输出规则根据当前ROOT级别, 日志输出时, 级别高于root默认的级别时 会输出 -->
<!-- scan 当此属性设置为 true 时, 配置文件如果发生改变, 将会被重新加载, 默认值为 true。 -->
<!-- scanPeriod 设置监测配置文件是否有修改的时间间隔, 如果没有给出时间单位, 默认单位是毫秒。当 scan 为 true 时, 此属性生效。默认的时间间隔为1分钟。 -->
<!-- debug 当此属性设置为 true 时, 将打印出 logback 内部日志信息, 实时查看 logback 运行状态。默认值为 false。 -->
<configuration scan="true" scanPeriod="60 seconds" debug="false">

  <!-- 引用 Spring Boot 的 logback 基础配置 -->
  <include resource="org/springframework/boot/logging/logback/defaults.xml" />

  <!-- 动态日志级别 -->
  <jmxConfigurator/>

  <!-- 日志记录级别 -->
  <springProperty name="log.level" source="logging.level.root" defaultValue="INFO"/>
  <!-- 应用名称 -->
  <springProperty name="log.appName" source="spring.application.name" defaultValue="SpringBoot"/>
  <!-- 日志文件存储路径 -->
  <springProperty name="log.directory" source="logging.file.path" defaultValue="tmp/app/${log.appName}/logs"/>
  <!-- 日志文件保留天数, 默认30天 -->
  <springProperty name="log.maxHistory" source="logging.file.max-size" defaultValue="30"/>
  <!-- 日志文件大小, 默认15M -->
  <springProperty name="log.maxSize" source="logging.file.max-history" defaultValue="15MB"/>


  <!-- 彩色日志 -->
  <!-- 配置格式变量:CONSOLE_LOG_PATTERN 彩色日志格式 -->
  <!-- boldMagenta:粗红-->
  <!-- cyan:青色 -->
  <!-- white:白色 -->
  <!-- magenta:洋红 -->
  <property name="CONSOLE_LOG_PATTERN"
    value="%yellow(%d{yyyy-MM-dd HH:mm:ss}) | %highlight(%-5level) ${PID:- } | %boldYellow(%thread)  %boldMagenta([TraceId: %X{traceId}]) | %blue(%file:%line) | %green(%logger) | %cyan(%m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx})"/>

  <property name="FILE_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss:SSS} | [%-5level] | [TraceId: %X{traceId}] | %-40.40logger{39} | %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/>

  <!-- ConsoleAppender 控制台输出日志 -->
  <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>
        <!-- 设置日志输出格式 -->
        ${CONSOLE_LOG_PATTERN}
      </pattern>
    </encoder>
  </appender>

  <!-- 所有日志都会记录-->
  <appender name="ALL" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
      <level>ALL</level>
    </filter>
    <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
      <fileNamePattern>${log.directory}/%d{yyyy-MM-dd}/all/${log.appName}-%i.log</fileNamePattern>
      <maxHistory>${log.maxHistory}</maxHistory>
      <MaxFileSize>${log.maxSize}</MaxFileSize>
    </rollingPolicy>
    <encoder>
      <pattern>${FILE_LOG_PATTERN}</pattern>
    </encoder>
  </appender>
  <!-- 异步写入日志,提升性能 -->
  <appender name="ASYNC_ALL" class="ch.qos.logback.classic.AsyncAppender">
    <!-- 不丢失日志。默认的,如果队列的 80% 已满,则会丢弃 TRACT、DEBUG、INFO 级别的日志 -->
    <discardingThreshold>0</discardingThreshold>
    <!-- 更改默认的队列的深度,该值会影响性能。默认值为 256 -->
    <queueSize>256</queueSize>
    <appender-ref ref="ALL"/>
  </appender>

  <springProfile name="prod">
    <!-- INFO级别日志 -->
    <!-- 滚动记录文件, 先将日志记录到指定文件, 当符合某个条件时, 将日志记录到其他文件 RollingFileAppender -->
    <appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
      <filter class="ch.qos.logback.classic.filter.LevelFilter">
        <level>INFO</level>
        <onMatch>ACCEPT</onMatch>
        <onMismatch>DENY</onMismatch>
      </filter>
      <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
        <fileNamePattern>${log.directory}/%d{yyyy-MM-dd}/info/${log.appName}-%i.log
        </fileNamePattern>
        <!-- 只保留最近30天的日志 -->
        <maxHistory>${log.maxHistory}</maxHistory>
        <!-- 日志文件最大的大小 -->
        <MaxFileSize>${log.maxSize}</MaxFileSize>
      </rollingPolicy>
      <encoder>
        <pattern>${FILE_LOG_PATTERN}</pattern>
      </encoder>
    </appender>
    <!-- 异步写入日志,提升性能 -->
    <appender name="ASYNC_INFO" class="ch.qos.logback.classic.AsyncAppender">
      <!-- 不丢失日志。默认的,如果队列的 80% 已满,则会丢弃 TRACT、DEBUG、INFO 级别的日志 -->
      <discardingThreshold>0</discardingThreshold>
      <!-- 更改默认的队列的深度,该值会影响性能。默认值为 256 -->
      <queueSize>256</queueSize>
      <appender-ref ref="INFO"/>
    </appender>

    <!-- WARN级别日志 -->
    <!-- 滚动记录文件, 先将日志记录到指定文件, 当符合某个条件时, 将日志记录到其他文件 RollingFileAppender -->
    <appender name="WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
      <!-- 过滤器, 只记录WARN级别的日志 -->
      <filter class="ch.qos.logback.classic.filter.LevelFilter">
        <!-- 设置过滤级别 -->
        <level>WARN</level>
        <!-- 匹配就记录 -->
        <onMatch>ACCEPT</onMatch>
        <!-- 不匹配就过滤 -->
        <onMismatch>DENY</onMismatch>
      </filter>
      <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
        <!--日志输出位置 可相对、和绝对路径 -->
        <fileNamePattern>${log.directory}/%d{yyyy-MM-dd}/warn/${log.appName}-%i.log</fileNamePattern>
        <!-- 只保留最近30天的日志 -->
        <maxHistory>${log.maxHistory}</maxHistory>
        <!-- 日志文件最大的大小 -->
        <MaxFileSize>${log.maxSize}</MaxFileSize>
      </rollingPolicy>
      <encoder>
        <pattern>${FILE_LOG_PATTERN}</pattern>
      </encoder>
    </appender>
    <!-- 异步写入日志,提升性能 -->
    <appender name="ASYNC_WARN" class="ch.qos.logback.classic.AsyncAppender">
      <!-- 不丢失日志。默认的,如果队列的 80% 已满,则会丢弃 TRACT、DEBUG、INFO 级别的日志 -->
      <discardingThreshold>0</discardingThreshold>
      <!-- 更改默认的队列的深度,该值会影响性能。默认值为 256 -->
      <queueSize>256</queueSize>
      <appender-ref ref="WARN"/>
    </appender>

    <!-- ERROR级别日志 -->
    <!-- 滚动记录文件, 先将日志记录到指定文件, 当符合某个条件时, 将日志记录到其他文件 RollingFileAppender -->
    <appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
      <!-- 过滤器, 只记录 ERROR 级别的日志 -->
      <filter class="ch.qos.logback.classic.filter.LevelFilter">
        <!-- 设置过滤级别 -->
        <level>ERROR</level>
        <!-- 匹配就记录 -->
        <onMatch>ACCEPT</onMatch>
        <!-- 不匹配就过滤 -->
        <onMismatch>DENY</onMismatch>
      </filter>
      <!-- 最常用的滚动策略, 它根据时间来制定滚动策略.既负责滚动也负责触发滚动 -->
      <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
        <!-- 日志名称, 如果没有 <File> 属性, 那么只会使用 <FileNamePattern> 的文件路径规则
            如果同时有 <File> 和 <FileNamePattern>, 那么当天日志是 <File>, 明天会自动把今天
            的日志重命名为今天的日期。即 <File> 的日志都是当天的。-->
        <!--日志输出位置 可相对、和绝对路径 -->
        <fileNamePattern>
          ${log.directory}/%d{yyyy-MM-dd}/error/${log.appName}-%i.log
        </fileNamePattern>
        <!-- 只保留最近30天的日志 -->
        <maxHistory>${log.maxHistory}</maxHistory>
        <!-- 日志文件最大的大小 -->
        <MaxFileSize>${log.maxSize}</MaxFileSize>
      </rollingPolicy>
      <encoder>
        <pattern>
          <!-- 设置日志输出格式 -->
          ${FILE_LOG_PATTERN}
        </pattern>
      </encoder>
    </appender>
    <!-- 异步写入日志,提升性能 -->
    <appender name="ASYNC_ERROR" class="ch.qos.logback.classic.AsyncAppender">
      <!-- 不丢失日志。默认的,如果队列的 80% 已满,则会丢弃 TRACT、DEBUG、INFO 级别的日志 -->
      <discardingThreshold>0</discardingThreshold>
      <!-- 更改默认的队列的深度,该值会影响性能。默认值为 256 -->
      <queueSize>256</queueSize>
      <appender-ref ref="ERROR"/>
    </appender>
  </springProfile>

  <root level="${log.level}">
    <appender-ref ref="CONSOLE"/>
    <appender-ref ref="ASYNC_ALL"/>
    <springProfile name="prod">
      <appender-ref ref="ASYNC_INFO"/>
      <appender-ref ref="ASYNC_WARN"/>
      <appender-ref ref="ASYNC_ERROR"/>
    </springProfile>
  </root>

  <!-- <springProfile name="prod"> -->
  <!--     <root level="${log.level}"> -->
  <!--         <appender-ref ref="ASYNC_INFO"/> -->
  <!--         <appender-ref ref="ASYNC_WARN"/> -->
  <!--         <appender-ref ref="ASYNC_ERROR"/> -->
  <!--     </root> -->
  <!-- </springProfile> -->

</configuration>

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐