问题: - LOG_PATTERN包含特殊字符(百分号、方括号等) - 通过-D参数传递导致shell解析错误 修改: - start.sh: 移除LOG_LEVEL_ROOT/LOG_LEVEL_APP/LOG_PATTERN参数 只保留logging.file.path用于指定日志目录 - logback-spring.xml: 日志格式改为直接配置 使用<property>而非<springProperty> - env.properties: 更新注释说明日志配置由logback管理 优势: - 启动命令简洁,无特殊字符解析问题 - 日志配置统一在logback-spring.xml管理 - 避免shell注入风险
135 lines
5.9 KiB
XML
135 lines
5.9 KiB
XML
<?xml version="1.0" encoding="UTF-8"?>
|
||
<configuration scan="true" scanPeriod="60 seconds" debug="false">
|
||
|
||
<!-- 从环境变量/系统属性读取配置 -->
|
||
<springProperty scope="context" name="APP_NAME" source="spring.application.name" defaultValue="fund-proj"/>
|
||
<springProperty scope="context" name="LOG_PATH" source="logging.file.path" defaultValue="/datacfs/applogs"/>
|
||
<springProperty scope="context" name="LOG_LEVEL_ROOT" source="logging.level.root" defaultValue="INFO"/>
|
||
<springProperty scope="context" name="LOG_LEVEL_APP" source="logging.level.app" defaultValue="DEBUG"/>
|
||
|
||
<!-- 日志格式(直接配置,不从参数读取避免shell解析问题) -->
|
||
<property name="LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId:-}][%X{spanId:-}] %-5level %logger{50} - %msg%n"/>
|
||
|
||
<!-- 控制台输出 -->
|
||
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
|
||
<encoder>
|
||
<pattern>${LOG_PATTERN}</pattern>
|
||
<charset>UTF-8</charset>
|
||
</encoder>
|
||
</appender>
|
||
|
||
<!-- INFO级别日志文件 -->
|
||
<appender name="FILE_INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
|
||
<file>${LOG_PATH}/${APP_NAME}/info.log</file>
|
||
<encoder>
|
||
<pattern>${LOG_PATTERN}</pattern>
|
||
<charset>UTF-8</charset>
|
||
</encoder>
|
||
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
|
||
<fileNamePattern>${LOG_PATH}/${APP_NAME}/info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
|
||
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
|
||
<maxFileSize>100MB</maxFileSize>
|
||
</timeBasedFileNamingAndTriggeringPolicy>
|
||
<maxHistory>30</maxHistory>
|
||
</rollingPolicy>
|
||
<filter class="ch.qos.logback.classic.filter.LevelFilter">
|
||
<level>INFO</level>
|
||
<onMatch>ACCEPT</onMatch>
|
||
<onMismatch>DENY</onMismatch>
|
||
</filter>
|
||
</appender>
|
||
|
||
<!-- ERROR级别日志文件 -->
|
||
<appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
|
||
<file>${LOG_PATH}/${APP_NAME}/error.log</file>
|
||
<encoder>
|
||
<pattern>${LOG_PATTERN}</pattern>
|
||
<charset>UTF-8</charset>
|
||
</encoder>
|
||
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
|
||
<fileNamePattern>${LOG_PATH}/${APP_NAME}/error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
|
||
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
|
||
<maxFileSize>100MB</maxFileSize>
|
||
</timeBasedFileNamingAndTriggeringPolicy>
|
||
<maxHistory>30</maxHistory>
|
||
</rollingPolicy>
|
||
<filter class="ch.qos.logback.classic.filter.LevelFilter">
|
||
<level>ERROR</level>
|
||
<onMatch>ACCEPT</onMatch>
|
||
<onMismatch>DENY</onMismatch>
|
||
</filter>
|
||
</appender>
|
||
|
||
<!-- JSON格式日志(用于ELK采集) -->
|
||
<appender name="JSON_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
|
||
<file>${LOG_PATH}/${APP_NAME}/json.log</file>
|
||
<encoder class="net.logstash.logback.encoder.LogstashEncoder">
|
||
<customFields>{"app_name":"${APP_NAME}"}</customFields>
|
||
<includeMdcKeyName>traceId</includeMdcKeyName>
|
||
<includeMdcKeyName>spanId</includeMdcKeyName>
|
||
<includeMdcKeyName>userId</includeMdcKeyName>
|
||
<includeMdcKeyName>tenantId</includeMdcKeyName>
|
||
</encoder>
|
||
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
|
||
<fileNamePattern>${LOG_PATH}/${APP_NAME}/json-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
|
||
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
|
||
<maxFileSize>100MB</maxFileSize>
|
||
</timeBasedFileNamingAndTriggeringPolicy>
|
||
<maxHistory>30</maxHistory>
|
||
</rollingPolicy>
|
||
</appender>
|
||
|
||
<!-- API请求日志文件(AOP) -->
|
||
<appender name="FILE_AOP" class="ch.qos.logback.core.rolling.RollingFileAppender">
|
||
<file>${LOG_PATH}/${APP_NAME}/aop.log</file>
|
||
<encoder>
|
||
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] - %msg%n</pattern>
|
||
<charset>UTF-8</charset>
|
||
</encoder>
|
||
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
|
||
<fileNamePattern>${LOG_PATH}/${APP_NAME}/aop-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
|
||
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
|
||
<maxFileSize>100MB</maxFileSize>
|
||
</timeBasedFileNamingAndTriggeringPolicy>
|
||
<maxHistory>30</maxHistory>
|
||
</rollingPolicy>
|
||
</appender>
|
||
|
||
<!-- API_LOG专用logger,输出到aop.log -->
|
||
<logger name="API_LOG" level="INFO" additivity="false">
|
||
<appender-ref ref="FILE_AOP"/>
|
||
</logger>
|
||
|
||
<!-- 应用包日志级别控制 -->
|
||
<logger name="com.fundplatform" level="${LOG_LEVEL_APP}" additivity="false">
|
||
<appender-ref ref="CONSOLE"/>
|
||
<appender-ref ref="FILE_INFO"/>
|
||
<appender-ref ref="FILE_ERROR"/>
|
||
</logger>
|
||
|
||
<!-- 开发环境 -->
|
||
<springProfile name="dev">
|
||
<root level="${LOG_LEVEL_ROOT}">
|
||
<appender-ref ref="CONSOLE"/>
|
||
</root>
|
||
</springProfile>
|
||
|
||
<!-- 生产环境 -->
|
||
<springProfile name="prod">
|
||
<root level="${LOG_LEVEL_ROOT}">
|
||
<appender-ref ref="CONSOLE"/>
|
||
<appender-ref ref="FILE_INFO"/>
|
||
<appender-ref ref="FILE_ERROR"/>
|
||
<appender-ref ref="JSON_FILE"/>
|
||
</root>
|
||
</springProfile>
|
||
|
||
<!-- 默认配置 -->
|
||
<root level="${LOG_LEVEL_ROOT}">
|
||
<appender-ref ref="CONSOLE"/>
|
||
<appender-ref ref="FILE_INFO"/>
|
||
<appender-ref ref="FILE_ERROR"/>
|
||
</root>
|
||
|
||
</configuration>
|