使用spring的aop监听所有controller或者action日志
日志还是使用log4,直接配置好文件输出或者控制台打印!
注解或者cml都行,我这里采用xml方式:
spring的配置文件中配置日志类和aop:
<!-- 日志监控类 -->
<bean id="actionLog" class="com.zhuzher.log.ActionLogAspect"></bean>
<!-- 监控所有action -->
<!-- 使用cglib代理 -->
<aop:config proxy-target-class="true">
<aop:pointcut id="logAction" expression="execution(* com.zhuzher.*.action.*.*(..))"/>
<aop:aspect id="b" ref="actionLog">
<!-- <aop:before pointcut-ref="logAction" method="before"/> -->
<aop:after pointcut-ref="logAction" method="after"/>
<!-- <aop:after-returning method="afterReturn" pointcut-ref="logAction" returning="result"/>
<aop:after-throwing method="afterThrow" pointcut-ref="logAction" throwing="ex"/> -->
</aop:aspect>
</aop:config>
,根据需要即可,
然后编写切面类,注意,最好使用cglib代理,需要添加依赖,默认使用jdk代理的话,所代理的类必须有接口,否则报错:
//action日志监听
public class ActionLogAspect { private final static Logger log = Logger.getLogger(ActionLogAspect.class);
/**
* 后置通知(无论方法是否发生异常都会执行,所以访问不到方法的返回值)
*/
public void after(JoinPoint joinPoint)throws IOException{
WriteToLog(joinPoint);
}
//把信息写进日志里面
public void WriteToLog(JoinPoint joinPoint)throws IOException {
HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.
getRequestAttributes()).getRequest();
//获取方法名
String cla=joinPoint.getTarget().getClass().getName();//action
String method=joinPoint.getSignature().getName();//method
//获取操作人
HttpSession session = request.getSession();
Manager manager = (Manager) session.getAttribute("SESSION_MANAGER");
Integer userid=null;
String username="";
if(manager!=null){
userid = manager.getId();
username =manager.getUsername();
}
StringBuffer json=new StringBuffer();//获取请求参数
Enumeration<String> names = request.getParameterNames();
while(names.hasMoreElements()){
//获取每一个文本域的name
String name = names.nextElement();
String [] values = request.getParameterValues(name);
if(values!=null && values.length>0){
//输出参数名和参数值
json.append(name+":{");
for(String val:values){
json.append(val+",");
}
if (','==json.charAt(json.length()-1)) json.deleteCharAt(json.length()-1);
json.append("},");
}
}
if (json!=null && json.length()>0 && ','==json.charAt(json.length()-1)) json.deleteCharAt(json.length()-1);
log.debug("{method:{"+cla+"."+method+"}, params:{"+json.toString()+"},user:{id:"+userid+",username:"+username+"}}");
}
}
获取对应的方法名,类名,以及从session中获取当前用户就可以了
使用spring的aop监听所有controller或者action日志的更多相关文章
- Spring之事件监听(观察者模型)
目录 Spring事件监听 一.事件监听案例 1.事件类 2.事件监听类 3.事件发布者 4.配置文件中注册 5.测试 二.Spring中事件监听分析 1. Spring中事件监听的结构 2. 核心角 ...
- spring中配置监听队列的MQ
一.spring中配置监听队列的MQ相关信息注:${}是读取propertites文件的常量,这里忽略.绿色部分配置在接收和发送端都要配置. <bean id="axx" ...
- Spring的事件监听机制
最近公司在重构广告系统,其中核心的打包功能由广告系统调用,即对apk打包的调用和打包完成之后的回调,需要提供相应的接口给广告系统.因此,为了将apk打包的核心流程和对接广告系统的业务解耦,利用了spr ...
- 十一、Spring之事件监听
Spring之事件监听 ApplicationListener ApplicationListener是Spring事件机制的一部分,与抽象类ApplicationEvent类配合来完成Applica ...
- Windows平台下Oracle监听服务启动过程中日志输出
Windows平台下Oracle监听服务启动过程中日志输出记录. 日志目录:D:\app\Administrator\diag\tnslsnr\WIN-RU03CB21QGA\listener\tra ...
- 利用spring的ApplicationListener监听某一类事件的发生
1.ApplicationListener在使用过程中可以监听某一事件的发生,可以做出相应的处理,这个方式不常用,但是在特殊情况下面还是有用的. 2.导包pom.xml <project xml ...
- Spring boot实现监听Redis key失效事件实现和其它方式
需求: 处理订单过期自动取消,比如下单30分钟未支付自动更改订单状态 用户绑定隐私号码当订单结束取消绑定等 解决方案1: 可以利用redis自带的key自动过期机制,下单时将订单id写入redis,过 ...
- Spring的事件监听ApplicationListener
ApplicationListener是Spring事件机制的一部分,与抽象类ApplicationEvent类配合来完成ApplicationContext的事件机制. 如果容器中存在Applica ...
- Spring Cloud Stream监听已存在的Queues/Exchanges
环境准备 rabbitmq已运行,端口5672,控制台web端口15672,用户名密码guest/guest 引入spring cloud stream依赖 compile('org.springfr ...
随机推荐
- Windows下CURL扩展无效之终极解决办法。
本地开发环境使用WAMP快速搭建,在使用PHP的CURL时可能会存在无法载入情况,这里提供终极解决方法. 1.在php.ini配置文件中启用 php_curll.dll 扩展: (环境已经自动附带 l ...
- 02.java并发编程之原子性操作
一.原子性操作 1.ThreadLocal 不同线程操作同一个 ThreadLocal 对象执行各种操作而不会影响其他线程里的值 注意:虽然ThreadLocal很有用,但是它作为一种线程级别的全局变 ...
- UVA 12633 Super Rooks on Chessboard(FFT)
题意: 给你一个R*C的棋盘,棋盘上的棋子会攻击,一个棋子会覆盖它所在的行,它所在的列,和它所在的从左上到右下的对角线,那么问这个棋盘上没有被覆盖的棋盘格子数.数据范围R,C,N<=50000 ...
- Ubuntu和Windows相互共享文件夹
一.Ubuntu访问Windows共享文件夹 1.对需要共享文件夹右击->属性->共享 2.选择要与其共享的用户,选择好用户点击有点添加按钮添加,然后点击下方的共享按钮 3.完成共享 4. ...
- Qt——线程类QThread
本文主要介绍Qt中线程类QThread的用法,参考(翻译+修改)了一篇文章:PyQt: Threading Basics Tutorial,虽然使用的是PyQt,但与C++中Qt的用法大同小异,不必太 ...
- c++11 类默认函数的控制:"=default" 和 "=delete"函数
c++11 类默认函数的控制:"=default" 和 "=delete"函数 #define _CRT_SECURE_NO_WARNINGS #include ...
- [洛谷P3175][HAOI2015]按位或
题目大意:刚开始有一个数$x=0$,每秒钟有一个数$y\in[0,2^n)(n\leqslant20)$按一定概率随机出现,数$i$的概率为$p_i$,保证$\sum\limits_{i=0}^{2^ ...
- wazhu之agent功能详解
一.日志数据收集 日志数据收集是从服务器或设备生成的记录中收集的实时过程.此组件可以通过文本文件或Windows事件日志接收日志.它还可以通过远程syslog直接接收日志,这对防火墙和其他此类设备 ...
- 响应式开发(三)-----Bootstrap框架的安装使用
下载 Bootstrap 可以从http://getbootstrap.com/上下载 Bootstrap 的最新版本. Download Bootstrap:下载 Bootstrap.点击该按钮,您 ...
- 【agc019D】Shift and Flip
Portal --> agc019D Description 给你一个\(A\)串一个\(B\)串(长度相等的两个\(01\)串),一次操作可以选择将\(A\)向左循环移动一位,将\(A\)向右 ...