refactor: 后台API日志配置优化

- service.properties: 移除重复日志配置(已由env.properties定义)
- logback-spring.xml: ERROR日志只输出到error.log
  - AOP_FILE/APP_FILE/SQL_FILE/CONSOLE添加ERROR过滤器
  - 更新注释说明配置来源于env.properties
This commit is contained in:
zhangjf 2026-02-26 19:12:57 +08:00
parent ed997e91c8
commit 13655445d2
3 changed files with 99 additions and 29 deletions

View File

@ -13,6 +13,10 @@ spring:
application: application:
name: worklog-api name: worklog-api
# 导入 service.properties使其参数对 logback-spring.xml 的 springProperty 可见
config:
import: optional:classpath:service.properties
# Jackson 配置 # Jackson 配置
jackson: jackson:
time-zone: GMT+8 time-zone: GMT+8

View File

@ -1,25 +1,43 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<configuration> <configuration>
<!--环境变量读取配置 --> <!-- env.properties 读取配置(生产环境由 start.sh 注入为系统属性,开发环境通过 spring.config.import 加载) -->
<springProperty scope="context" name="APP_NAME" source="spring.application.name" defaultValue="worklog-api"/> <springProperty scope="context" name="APP_NAME" source="APP_NAME" defaultValue="worklog-api"/>
<springProperty scope="context" name="LOG_PATH" source="logging.file.path" defaultValue="./logs"/> <springProperty scope="context" name="LOG_PATH" source="LOG_PATH" defaultValue="./logs"/>
<springProperty scope="context" name="LOG_LEVEL_ROOT" source="logging.level.root" defaultValue="INFO"/> <springProperty scope="context" name="LOG_LEVEL_ROOT" source="LOG_LEVEL_ROOT" defaultValue="INFO"/>
<springProperty scope="context" name="LOG_LEVEL_APP" source="logging.level.app" defaultValue="DEBUG"/> <springProperty scope="context" name="LOG_LEVEL_APP" source="LOG_LEVEL_APP" defaultValue="DEBUG"/>
<!-- 日志格式:强制包含 traceId 和 spanId --> <!-- 日志格式:包含 traceId 和 spanId -->
<property name="LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId:-}][%X{spanId:-}] %-5level %logger{50} - %msg%n"/> <property name="LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId:-}][%X{spanId:-}] %-5level %logger{50} - %msg%n"/>
<!-- 控制台输出 --> <!-- ===== Appenders ===== -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<!-- 1. AOP日志ApiLogAspect 请求/响应日志不含ERRORERROR只输出到error.log -->
<appender name="AOP_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/aop.log</file>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>DENY</onMatch>
<onMismatch>ACCEPT</onMismatch>
</filter>
<encoder> <encoder>
<pattern>${LOG_PATTERN}</pattern> <pattern>${LOG_PATTERN}</pattern>
<charset>UTF-8</charset> <charset>UTF-8</charset>
</encoder> </encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/aop-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxFileSize>100MB</maxFileSize>
<maxHistory>30</maxHistory>
</rollingPolicy>
</appender> </appender>
<!-- 应用日志文件输出 - 直接输出到 logs/ 目录 --> <!-- 2. 应用日志com.wjbl.worklog 业务日志不含ERRORERROR只输出到error.log -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <appender name="APP_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/app.log</file> <file>${LOG_PATH}/app.log</file>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>DENY</onMatch>
<onMismatch>ACCEPT</onMismatch>
</filter>
<encoder> <encoder>
<pattern>${LOG_PATTERN}</pattern> <pattern>${LOG_PATTERN}</pattern>
<charset>UTF-8</charset> <charset>UTF-8</charset>
@ -31,9 +49,14 @@
</rollingPolicy> </rollingPolicy>
</appender> </appender>
<!-- SQL日志文件输出 - MyBatis-Plus SQL 日志独立输出 --> <!-- 3. SQL日志数据库操作日志不含ERRORERROR只输出到error.log -->
<appender name="SQL_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <appender name="SQL_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/sql.log</file> <file>${LOG_PATH}/sql.log</file>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>DENY</onMatch>
<onMismatch>ACCEPT</onMismatch>
</filter>
<encoder> <encoder>
<pattern>${LOG_PATTERN}</pattern> <pattern>${LOG_PATTERN}</pattern>
<charset>UTF-8</charset> <charset>UTF-8</charset>
@ -45,21 +68,65 @@
</rollingPolicy> </rollingPolicy>
</appender> </appender>
<!-- MyBatis-Plus SQL日志 --> <!-- 4. 异常日志:所有 ERROR 级别日志集中输出 -->
<appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/error.log</file>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
<encoder>
<pattern>${LOG_PATTERN}</pattern>
<charset>UTF-8</charset>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxFileSize>100MB</maxFileSize>
<maxHistory>30</maxHistory>
</rollingPolicy>
</appender>
<!-- 控制台输出开发环境调试用不含ERRORERROR只输出到error.log -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>DENY</onMatch>
<onMismatch>ACCEPT</onMismatch>
</filter>
<encoder>
<pattern>${LOG_PATTERN}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- ===== Loggers ===== -->
<!-- ApiLogAspect → aop.log比 com.wjbl.worklog 更具体,优先匹配) -->
<logger name="com.wjbl.worklog.config.ApiLogAspect" level="DEBUG" additivity="false">
<appender-ref ref="AOP_FILE"/>
<appender-ref ref="ERROR_FILE"/>
</logger>
<!-- MyBatis Mapper SQL → sql.log -->
<logger name="com.wjbl.worklog.data.mapper" level="DEBUG" additivity="false"> <logger name="com.wjbl.worklog.data.mapper" level="DEBUG" additivity="false">
<appender-ref ref="SQL_FILE"/> <appender-ref ref="SQL_FILE"/>
<appender-ref ref="CONSOLE"/> <appender-ref ref="ERROR_FILE"/>
</logger> </logger>
<!-- MyBatis-Plus 框架日志 --> <!-- MyBatis-Plus 框架 SQL → sql.log -->
<logger name="com.baomidou.mybatisplus" level="DEBUG" additivity="false"> <logger name="com.baomidou.mybatisplus" level="DEBUG" additivity="false">
<appender-ref ref="SQL_FILE"/> <appender-ref ref="SQL_FILE"/>
<appender-ref ref="CONSOLE"/> <appender-ref ref="ERROR_FILE"/>
</logger> </logger>
<!-- 根日志级别 --> <!-- com.wjbl.worklog 业务日志 → app.logApiLogAspect 和 mapper 已被上方更具体的 logger 拦截) -->
<logger name="com.wjbl.worklog" level="${LOG_LEVEL_APP}" additivity="false">
<appender-ref ref="APP_FILE"/>
<appender-ref ref="ERROR_FILE"/>
</logger>
<!-- 根日志:其余所有日志 → stdout.log -->
<root level="${LOG_LEVEL_ROOT}"> <root level="${LOG_LEVEL_ROOT}">
<appender-ref ref="ERROR_FILE"/>
<appender-ref ref="CONSOLE"/> <appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
</root> </root>
</configuration> </configuration>

View File

@ -18,8 +18,7 @@ TENANT_ID=
MAIN_CLASS=com.wjbl.worklog.WorklogApplication MAIN_CLASS=com.wjbl.worklog.WorklogApplication
# ==================== 个性化覆盖配置(可选) ==================== # ==================== 个性化覆盖配置(可选) ====================
# 如果当前服务需要使用不同的日志路径,可在此覆盖 # 生产环境可在 conf/service.properties 中覆盖以下参数:
# LOG_PATH=/var/logs/worklog-api # LOG_PATH=/var/logs/worklog-api
# LOG_LEVEL_ROOT=WARN
# 如果当前服务需要使用不同的日志级别,可在此覆盖
# LOG_LEVEL_APP=INFO # LOG_LEVEL_APP=INFO