9 changed files with 391 additions and 22 deletions
@ -0,0 +1,174 @@ |
|||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||
|
<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 --> |
||||
|
<!-- scan 当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。 --> |
||||
|
<!-- scanPeriod 设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 --> |
||||
|
<!-- debug 当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 --> |
||||
|
<configuration scan="false" scanPeriod="60 seconds" debug="false"> |
||||
|
|
||||
|
<!-- 读取application.properties配置 --> |
||||
|
<!-- <property resource="application.properties" />--> |
||||
|
|
||||
|
<contextName>logback</contextName> |
||||
|
<!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。 --> |
||||
|
<!--Linux下的路径--> |
||||
|
<!--<property name="log.path" value="/www/wwwroot/zdj_log/" />--> |
||||
|
|
||||
|
<!-- 生成文件名前缀 --> |
||||
|
<property name="FILE_PREFIX" value="Reddoor" /> |
||||
|
<!-- 输出文件路径 --> |
||||
|
<property name="OPEN_FILE_PATH" value="./logs"/> |
||||
|
<!-- 文件保存时间 这里是7天 --> |
||||
|
<property name="EXIST_TIME" value="7"/> |
||||
|
<!-- 文件输出格式 --> |
||||
|
<property name="PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"/> |
||||
|
<!-- 日志文件最大的大小 --> |
||||
|
<property name="MAX_FILE_SIZE" value="100MB"/> |
||||
|
|
||||
|
<!-- 彩色日志 --> |
||||
|
<!-- 彩色日志依赖的渲染类 --> |
||||
|
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" /> |
||||
|
<conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" /> |
||||
|
<conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" /> |
||||
|
<!-- 彩色日志格式 --> |
||||
|
<property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/> |
||||
|
|
||||
|
|
||||
|
<!--输出到控制台--> |
||||
|
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> |
||||
|
<!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息--> |
||||
|
<filter class="ch.qos.logback.classic.filter.ThresholdFilter"> |
||||
|
<level>debug</level> |
||||
|
</filter> |
||||
|
<encoder> |
||||
|
<Pattern>${CONSOLE_LOG_PATTERN}</Pattern> |
||||
|
<!-- 设置字符集 --> |
||||
|
<charset>UTF-8</charset> |
||||
|
</encoder> |
||||
|
</appender> |
||||
|
|
||||
|
|
||||
|
<!--输出到debug文件--> |
||||
|
<appender name="debug" class="ch.qos.logback.core.rolling.RollingFileAppender"> |
||||
|
<!-- 正在记录的日志文件的路径及文件名 --> |
||||
|
<file>${OPEN_FILE_PATH}/log_debug.log</file> |
||||
|
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> |
||||
|
<FileNamePattern>${OPEN_FILE_PATH}/debug/${FILE_PREFIX}-debug_%d{yyyy-MM-dd}-%i.log</FileNamePattern> |
||||
|
<MaxHistory>30</MaxHistory> |
||||
|
<TimeBasedFileNamingAndTriggeringPolicy |
||||
|
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> |
||||
|
<MaxFileSize>${MAX_FILE_SIZE}</MaxFileSize> |
||||
|
</TimeBasedFileNamingAndTriggeringPolicy> |
||||
|
</rollingPolicy> |
||||
|
<append>true</append> |
||||
|
<encoder> |
||||
|
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern> |
||||
|
<charset>utf-8</charset> |
||||
|
</encoder> |
||||
|
<!-- 只打印DEBUG日志, --> |
||||
|
<filter class="ch.qos.logback.classic.filter.LevelFilter"> |
||||
|
<!-- 过滤的级别 --> |
||||
|
<level>DEBUG</level> |
||||
|
<!-- 匹配时的操作:接收(记录) --> |
||||
|
<onMatch>ACCEPT</onMatch> |
||||
|
<!-- 不匹配时的操作:拒绝(不记录) --> |
||||
|
<onMismatch>DENY</onMismatch> |
||||
|
</filter> |
||||
|
</appender> |
||||
|
|
||||
|
<!--输出到info文件--> |
||||
|
<appender name="info" class="ch.qos.logback.core.rolling.RollingFileAppender"> |
||||
|
<!-- 正在记录的日志文件的路径及文件名 --> |
||||
|
<file>${OPEN_FILE_PATH}/log_info.log</file> |
||||
|
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> |
||||
|
<FileNamePattern>${OPEN_FILE_PATH}/info/${FILE_PREFIX}_%d{yyyy-MM-dd}-%i.log</FileNamePattern> |
||||
|
<MaxHistory>30</MaxHistory> |
||||
|
<TimeBasedFileNamingAndTriggeringPolicy |
||||
|
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> |
||||
|
<MaxFileSize>${MAX_FILE_SIZE}</MaxFileSize> |
||||
|
</TimeBasedFileNamingAndTriggeringPolicy> |
||||
|
</rollingPolicy> |
||||
|
<append>true</append> |
||||
|
<encoder> |
||||
|
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern> |
||||
|
<charset>utf-8</charset> |
||||
|
</encoder> |
||||
|
<!-- 只打印INFO日志 --> |
||||
|
<filter class="ch.qos.logback.classic.filter.LevelFilter"> |
||||
|
<level>INFO</level> |
||||
|
<!-- 匹配时的操作:接收(记录) --> |
||||
|
<onMatch>ACCEPT</onMatch> |
||||
|
<!-- 不匹配时的操作:拒绝(不记录) --> |
||||
|
<onMismatch>DENY</onMismatch> |
||||
|
</filter> |
||||
|
</appender> |
||||
|
|
||||
|
<!--输出到warn文件--> |
||||
|
<appender name="warn" class="ch.qos.logback.core.rolling.RollingFileAppender"> |
||||
|
<!-- 正在记录的日志文件的路径及文件名 --> |
||||
|
<file>${OPEN_FILE_PATH}/log_warn.log</file> |
||||
|
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> |
||||
|
<FileNamePattern>${OPEN_FILE_PATH}/warn/${FILE_PREFIX}_%d{yyyy-MM-dd}-%i.log</FileNamePattern> |
||||
|
<MaxHistory>30</MaxHistory> |
||||
|
<TimeBasedFileNamingAndTriggeringPolicy |
||||
|
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> |
||||
|
<MaxFileSize>${MAX_FILE_SIZE}</MaxFileSize> |
||||
|
</TimeBasedFileNamingAndTriggeringPolicy> |
||||
|
</rollingPolicy> |
||||
|
<append>true</append> |
||||
|
<encoder> |
||||
|
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern> |
||||
|
<charset>utf-8</charset> |
||||
|
</encoder> |
||||
|
<!-- 只打印WARN日志 --> |
||||
|
<filter class="ch.qos.logback.classic.filter.LevelFilter"> |
||||
|
<level>WARN</level> |
||||
|
<!-- 匹配时的操作:接收(记录) --> |
||||
|
<onMatch>ACCEPT</onMatch> |
||||
|
<!-- 不匹配时的操作:拒绝(不记录) --> |
||||
|
<onMismatch>DENY</onMismatch> |
||||
|
</filter> |
||||
|
</appender> |
||||
|
|
||||
|
<!-- 时间滚动输出 level为 ERROR 日志 --> |
||||
|
<appender name="error" class="ch.qos.logback.core.rolling.RollingFileAppender"> |
||||
|
<!-- 正在记录的日志文件的路径及文件名 --> |
||||
|
<file>${OPEN_FILE_PATH}/log_error.log</file> |
||||
|
<!--日志文件输出格式--> |
||||
|
<encoder> |
||||
|
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> |
||||
|
<charset>UTF-8</charset> <!-- 此处设置字符集 --> |
||||
|
</encoder> |
||||
|
<!-- 日志记录器的滚动策略,按日期,按大小记录 --> |
||||
|
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> |
||||
|
<fileNamePattern>${log.path}/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern> |
||||
|
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> |
||||
|
<maxFileSize>100MB</maxFileSize> |
||||
|
</timeBasedFileNamingAndTriggeringPolicy> |
||||
|
<!--日志文件保留天数--> |
||||
|
<maxHistory>15</maxHistory> |
||||
|
</rollingPolicy> |
||||
|
<!-- 此日志文件只记录ERROR级别的 --> |
||||
|
<filter class="ch.qos.logback.classic.filter.LevelFilter"> |
||||
|
<level>ERROR</level> |
||||
|
<onMatch>ACCEPT</onMatch> |
||||
|
<onMismatch>DENY</onMismatch> |
||||
|
</filter> |
||||
|
</appender> |
||||
|
|
||||
|
<!--设置为OFF,即屏蔽; 留下sqltiming作为INFO级别输出--> |
||||
|
<logger name="jdbc.connection" level="OFF"/> |
||||
|
<logger name="jdbc.resultset" level="OFF"/> |
||||
|
<logger name="jdbc.resultsettable" level="OFF"/> |
||||
|
<logger name="jdbc.audit" level="OFF"/> |
||||
|
<logger name="jdbc.sqltiming" level="info"/> |
||||
|
<logger name="jdbc.sqlonly" level="OFF"/> |
||||
|
|
||||
|
<!-- 默认输出info等级,然后再根据各自的拦截过滤规则去处理 --> |
||||
|
<root level="INFO"> |
||||
|
<appender-ref ref="CONSOLE"/> |
||||
|
<!--<appender-ref ref="debug" />--> |
||||
|
<appender-ref ref="info" /> |
||||
|
<appender-ref ref="error" /> |
||||
|
<!--<appender-ref ref="warn" />--> |
||||
|
</root> |
||||
|
</configuration> |
||||
@ -0,0 +1,62 @@ |
|||||
|
package cc.hiver.core.config.cache; |
||||
|
|
||||
|
import org.springframework.beans.factory.InitializingBean; |
||||
|
import org.springframework.cache.Cache; |
||||
|
import org.springframework.cache.CacheManager; |
||||
|
import org.springframework.cache.interceptor.CacheOperationInvocationContext; |
||||
|
import org.springframework.cache.interceptor.CacheResolver; |
||||
|
import org.springframework.lang.Nullable; |
||||
|
import org.springframework.util.Assert; |
||||
|
|
||||
|
import java.util.ArrayList; |
||||
|
import java.util.Collection; |
||||
|
import java.util.Collections; |
||||
|
import java.util.List; |
||||
|
|
||||
|
public class CustomCacheResolver implements CacheResolver, InitializingBean { |
||||
|
|
||||
|
@Nullable |
||||
|
private List<CacheManager> cacheManagerList; |
||||
|
|
||||
|
public CustomCacheResolver(){ |
||||
|
} |
||||
|
public CustomCacheResolver(List<CacheManager> cacheManagerList){ |
||||
|
this.cacheManagerList = cacheManagerList; |
||||
|
} |
||||
|
|
||||
|
public void setCacheManagerList(@Nullable List<CacheManager> cacheManagerList) { |
||||
|
this.cacheManagerList = cacheManagerList; |
||||
|
} |
||||
|
public List<CacheManager> getCacheManagerList() { |
||||
|
return cacheManagerList; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public void afterPropertiesSet() { |
||||
|
Assert.notNull(this.cacheManagerList, "CacheManager is required"); |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public Collection<? extends Cache> resolveCaches(CacheOperationInvocationContext<?> context) { |
||||
|
Collection<String> cacheNames = getCacheNames(context); |
||||
|
if (cacheNames == null) { |
||||
|
return Collections.emptyList(); |
||||
|
} |
||||
|
Collection<Cache> result = new ArrayList<>(); |
||||
|
for(CacheManager cacheManager : getCacheManagerList()){ |
||||
|
for (String cacheName : cacheNames) { |
||||
|
Cache cache = cacheManager.getCache(cacheName); |
||||
|
if (cache == null) { |
||||
|
throw new IllegalArgumentException("Cannot find cache named '" + |
||||
|
cacheName + "' for " + context.getOperation()); |
||||
|
} |
||||
|
result.add(cache); |
||||
|
} |
||||
|
} |
||||
|
return result; |
||||
|
} |
||||
|
|
||||
|
private Collection<String> getCacheNames(CacheOperationInvocationContext<?> context){ |
||||
|
return context.getOperation().getCacheNames(); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,41 @@ |
|||||
|
package cc.hiver.base.handler; |
||||
|
|
||||
|
import cc.hiver.core.entity.OrderXd; |
||||
|
import lombok.AllArgsConstructor; |
||||
|
import lombok.extern.slf4j.Slf4j; |
||||
|
import org.springframework.data.redis.core.RedisTemplate; |
||||
|
import org.springframework.stereotype.Component; |
||||
|
import top.javatool.canal.client.annotation.CanalTable; |
||||
|
import top.javatool.canal.client.handler.EntryHandler; |
||||
|
|
||||
|
/** |
||||
|
* @author benjamin_5 |
||||
|
* @Description |
||||
|
* @date 2022/9/25 |
||||
|
*/ |
||||
|
@CanalTable("bs_ecif") |
||||
|
@Component |
||||
|
@AllArgsConstructor |
||||
|
@Slf4j |
||||
|
public class OrderXdHandler implements EntryHandler<OrderXd> { |
||||
|
|
||||
|
private final RedisTemplate<Object,Object> redisTemplate; |
||||
|
|
||||
|
@Override |
||||
|
public void insert(OrderXd orderXd) { |
||||
|
log.info("[新增]"+orderXd.toString()); |
||||
|
redisTemplate.opsForValue().set("ORDER:"+orderXd.getOrderId(),orderXd); |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public void update(OrderXd before, OrderXd after) { |
||||
|
log.info("[更新]"+after.toString()); |
||||
|
redisTemplate.opsForValue().set("ORDER:"+after.getOrderId(),after); |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public void delete(OrderXd orderXd) { |
||||
|
log.info("[删除]"+orderXd); |
||||
|
redisTemplate.delete("ORDER:"+orderXd.getOrderId()); |
||||
|
} |
||||
|
} |
||||
Loading…
Reference in new issue