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