1.日志的配置文件--classpath下 模板如下
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<!-- 这个是配置全局项目日志,上线初期阶段:为了看系统运行状况Threshold设置info或debug,当系统运行一段时间后,稳定了Threshold设置warn或error,提高日志级别,减少日志输出量 -->
<appender name="INFO" class="org.apache.log4j.DailyRollingFileAppender">
<param name="file" value="${catalina.base}/logs/flash-info.log" />
<param name="threshold" value="info" />
<param name="encoding" value="UTF-8" />
<param name="append" value="true" />
<!-- Rollover at midnight each day -->
<param name="DatePattern" value="'.'yyyy-MM-dd" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%n%-4r [%d{yyyy-MM-dd HH:mm:ss}] %p [%t] %c | %m%n" />
</layout>
</appender>
<appender name="ERROR" class="org.apache.log4j.DailyRollingFileAppender">
<param name="file" value="${catalina.base}/logs/flash-error.log" />
<param name="threshold" value="error" />
<param name="encoding" value="UTF-8" />
<param name="append" value="false" />
<!-- Rollover at midnight each day -->
<param name="DatePattern" value="'.'yyyy-MM-dd" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%n%-4r [%d{yyyy-MM-dd HH:mm:ss}] %p [%t] %c | %m%n" />
</layout>
</appender>
<!-- name:debug -->
<appender name="debug" class="org.apache.log4j.DailyRollingFileAppender">
<!-- File: 日志文件存放路径 -->
<param name="File" value="${catalina.base}/logs/debug/debug.log" />
<!-- Append: 追加模式 -->
<param name="Append" value="true" />
<!-- Threshold: 打印日志级别 debug、info、warn、error -->
<param name="Threshold" value="info" />
<param name="DatePattern" value="'.'yyyy-MM-dd" />
<param name="encoding" value="UTF-8" />
<!-- DatePattern: 日志分割 错误日志以小时来分割 -->
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss:SSS} %p [%t] %c | %m%n" />
</layout>
</appender>
<appender name="sqlLogger" class="org.apache.log4j.DailyRollingFileAppender">
<!-- File: 日志文件存放路径 -->
<param name="File" value="${catalina.base}/logs/sql/sql.log" />
<param name="Append" value="true" />
<!-- Threshold设置为info级别 -->
<param name="Threshold" value="info" />
<param name="DatePattern" value="'.'yyyy-MM-dd-HH" />
<param name="encoding" value="UTF-8" />
<!-- DatePattern: 日志分割 事件日志以小时来分割 -->
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss:SSS} %p [%t] %c | %m%n" />
</layout>
</appender>
<root>
<appender-ref ref="INFO" />
<appender-ref ref="ERROR" />
</root>
</log4j:configuration>
2.表设计
3.注入线程池 bean
/**
* 执行周期性或定时任务
*/
@Bean(name = "scheduledExecutorService")
protected ScheduledExecutorService scheduledExecutorService()
{
return new ScheduledThreadPoolExecutor(corePoolSize,
new BasicThreadFactory.Builder().namingPattern("schedule-pool-%d").daemon(true).build())
{
@Override
protected void afterExecute(Runnable r, Throwable t)
{
super.afterExecute(r, t);
Threads.printException(r, t);
}
};
}
4.操作日志
使用:在方法上使用注解@Log就可以实现记录操作日志的功能
@Log(title = "用户管理", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@Validated @RequestBody SysUser user)
{
......
return toAjax(userService.insertUser(user));
}
AOP的原理是什么
Spring AOP 概述
相信大家或多或少的了解过AOP,都知道它是面向切面编程,在网上搜索可以找到很多的解释。这里我用一句话来总结:AOP是能够让我们在不影响原有功能的前提下,为软件横向扩展功能。 那么横向扩展怎么理解呢,我们在WEB项目开发中,通常都遵守三层原则,包括控制层(Controller)->业务层(Service)->数据层(dao),那么从这个结构下来的为纵向,它具体的某一层就是我们所说的横向。我们的AOP就是可以作用于这某一个横向模块当中的所有方法。
我们在来看一下AOP和OOP的区别:AOP是OOP的补充,当我们需要为多个对象引入一个公共行为,比如日志,操作记录等,就需要在每个对象中引用公共行为,这样程序就产生了大量的重复代码,使用AOP可以完美解决这个问题。
接下来介绍一下提到AOP就必须要了解的知识点:
切面:拦截器类,其中会定义切点以及通知
切点:具体拦截的某个业务点。
通知:切面当中的方法,声明通知方法在目标业务层的执行位置,通知类型如下:
前置通知:@Before 在目标业务方法执行之前执行
后置通知:@After 在目标业务方法执行之后执行
返回通知:@AfterReturning 在目标业务方法返回结果之后执行
异常通知:@AfterThrowing 在目标业务方法抛出异常之后
环绕通知:@Around 功能强大,可代替以上四种通知,还可以控制目标业务方法是否执行以及何时执行
为什么要AOP+Kafka模块封装
核心思想:
spring的aop切面负责产生数据,也就是数据源(也可以直接通过logstash读取log文件)
kafka 消息队列来做数据缓冲以及异步传输
使用模块封装更方便其他项目所依赖