446
社区成员




日志:
日志配置目录:
日志配置:
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="30 seconds">
<!-- 动态参数配置 -->
<property name="pluginId" value="${pluginId:-UNKNOWN_PLUGIN}"/>
<property name="logDir" value="${LOG_DIR:-/var/log/bifromq/plugins}"/>
<property name="logPattern"
value="%d{yyyy-MM-dd HH:mm:ss.SSS} | %-5p | ${HOSTNAME:-NA} | ${PID:-NA} | [%t] | %-40logger{40} [%F:%L] | %m%n%ex{full}"/>
<!-- 异步日志队列参数 -->
<property name="asyncQueueSize" value="8192"/>
<property name="asyncDiscardThreshold" value="0"/> <!-- 0表示不丢弃日志 -->
<!-- 1. TRACE 级别日志 (异步) -->
<appender name="ASYNC_TRACE" class="ch.qos.logback.classic.AsyncAppender">
<queueSize>${asyncQueueSize}</queueSize>
<discardingThreshold>${asyncDiscardThreshold}</discardingThreshold>
<appender-ref ref="TRACE_FILE"/>
</appender>
<appender name="TRACE_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${logDir}/${pluginId}/trace.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${logDir}/${pluginId}/trace.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<maxHistory>60</maxHistory> <!-- 等保要求最低60天 -->
<maxFileSize>1GB</maxFileSize>
<totalSizeCap>100GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>${logPattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>TRACE</level>
</filter>
</appender>
<!-- 2. DEBUG 级别日志 (异步) -->
<appender name="ASYNC_DEBUG" class="ch.qos.logback.classic.AsyncAppender">
<queueSize>${asyncQueueSize}</queueSize>
<appender-ref ref="DEBUG_FILE"/>
</appender>
<appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${logDir}/${pluginId}/debug.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${logDir}/${pluginId}/debug.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
<maxHistory>60</maxHistory>
<maxFileSize>2GB</maxFileSize>
<totalSizeCap>200GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>${logPattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>DEBUG</level>
</filter>
</appender>
<!-- 3. INFO 级别日志 (异步) -->
<appender name="ASYNC_INFO" class="ch.qos.logback.classic.AsyncAppender">
<queueSize>${asyncQueueSize}</queueSize>
<appender-ref ref="INFO_FILE"/>
</appender>
<appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${logDir}/${pluginId}/info.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${logDir}/${pluginId}/info.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxHistory>180</maxHistory> <!-- 业务日志保留半年 -->
<maxFileSize>5GB</maxFileSize>
<totalSizeCap>500GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>${logPattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
</appender>
<!-- 4. WARN 级别日志 (同步) -->
<appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${logDir}/${pluginId}/warn.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${logDir}/${pluginId}/warn.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>365</maxHistory> <!-- 警告日志保留1年 -->
</rollingPolicy>
<encoder>
<pattern>${logPattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>WARN</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 5. ERROR 级别日志 (同步+告警触发) -->
<appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${logDir}/${pluginId}/error.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${logDir}/${pluginId}/error.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>365</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${logPattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 6. 安全审计日志 (异步+严格保留) -->
<appender name="ASYNC_AUDIT" class="ch.qos.logback.classic.AsyncAppender">
<queueSize>1024</queueSize>
<appender-ref ref="AUDIT_FILE"/>
</appender>
<appender name="AUDIT_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${logDir}/${pluginId}/audit.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${logDir}/${pluginId}/audit.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>730</maxHistory> <!-- 审计日志保留2年 -->
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} | AUDIT | ${HOSTNAME} | ${pluginId} | %m%n</pattern>
</encoder>
</appender>
<!-- 日志分级控制 -->
<logger name="com.baidu.bifromq" level="WARN" additivity="false"/>
<logger name="org.pf4j" level="WARN" additivity="false"/>
<!-- 主业务日志 -->
<logger name="com.mqttsnet.thinglinks" level="INFO">
<appender-ref ref="ASYNC_TRACE"/>
<appender-ref ref="ASYNC_DEBUG"/>
<appender-ref ref="ASYNC_INFO"/>
<appender-ref ref="WARN_FILE"/>
<appender-ref ref="ERROR_FILE"/>
</logger>
<!-- 安全审计日志 -->
<logger name="com.mqttsnet.thinglinks.audit" level="INFO" additivity="false">
<appender-ref ref="ASYNC_AUDIT"/>
</logger>
<root level="WARN">
<appender-ref ref="INFO_FILE"/>
</root>
</configuration>