java aop 日志打印 正则设置
package tz.lion.Utils.aop; import com.alibaba.fastjson.JSON;
import org.springframework.web.multipart.MultipartFile;
import tz.lion.config.shiro.SessionHolder;
import tz.lion.domain.master.SysUser;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest;
import java.util.Enumeration; /**
* aop实现web层的日志切面
* @author 104
*/
@Aspect
@Component
public class WebLogAspect { private Logger logger = LoggerFactory.getLogger("webLogAspect"); ThreadLocal<Long> startTime = new ThreadLocal<Long>(); /**
* 定义一个切入点
*/
@Pointcut("execution(public * tz.lion.controller.*..*.*(..))")
public void webLog(){}
/**
* 定义一个非切入点
* controller 方法名称,以UnAop 开头 不打印日志;例如文件参数等长字符
*/
@Pointcut("!execution(public * tz.lion.controller.*..*.UnAop*(..))")
private void logSender(){}
/**
* 处理日志,打印请求相关数据
* @param joinPoint
*/
@Before("webLog()&&logSender()")
public void doBefore(JoinPoint joinPoint){
startTime.set(System.currentTimeMillis()); SysUser user = SessionHolder.getHolder().getSessionAttribute(SessionHolder.CURRENT_USER);
if(user != null){
logger.info("UserId : "+user.getId());
}
// 接收到请求,记录请求内容
logger.info("WebLogAspect.doBefore()");
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest(); try{
// 记录下请求内容
logger.info("URL : " + request.getRequestURL().toString());
logger.info("HTTP_METHOD : " + request.getMethod());
logger.info("IP : " + request.getRemoteAddr());
logger.info("CLASS_METHOD : " + joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName()); boolean hasFile=false;
for(Object obj:joinPoint.getArgs()){
if(obj instanceof MultipartFile){
hasFile=true;
}
}
if(hasFile){
logger.info("ARGS : 上传文件接口 ");
}else{
logger.info("ARGS : " + JSON.toJSONString(joinPoint.getArgs()));
}
}catch(Exception e){
logger.info("获取请求参数失败");
}
Enumeration<String> enu=request.getParameterNames();
while(enu.hasMoreElements()){
String paraName=enu.nextElement();
logger.info("request paraName ARGS"+paraName+": "+request.getParameter(paraName));
}
} /**
* 处理完请求,返回内容
* @param joinPoint
*/
@AfterReturning(returning="result", pointcut = "webLog()")
public void doAfterReturning(JoinPoint joinPoint,Object result){
logger.info("WebLogAspect.doAfterReturning()");
String res = JSON.toJSONString(result);
if(res.length()<=2000){
logger.info("返回数据:"+res);
}
logger.info("耗时(毫秒) : " + (System.currentTimeMillis() - startTime.get()));
} }
java aop 日志打印 正则设置的更多相关文章
- java中日志打印
目录 一.预先判断日志级别 二.避免无效日志打印 三.区别对待错误日志 四.保证记录完整内容 打印日志,要注意下面4点. 一.预先判断日志级别 对DEBUG.INFO级别的日志,必须使用条件输出或者使 ...
- web项目的日志打印位置设置
1, 若在项目中放logback.groovy文件(如: src/test/resource下),则日志会打印到控制台上. logback.groovy 内容如下: // // Built on Fr ...
- 基于XML配置的AOP实现日志打印
Spring中可以使用注解或XML文件配置的方式实现AOP.1.导入jar包 com.springsource.net.sf.cglib -2.2.0.jar com.springsource.org ...
- 简单的aop实现日志打印(切入点表达式)
Spring中可以使用注解或XML文件配置的方式实现AOP. 1.导入jar包 com.springsource.net.sf.cglib -2.2.0.jar com.springsource.or ...
- springboot2整合logback.xml动态修改日志打印级别
今天找bug烦到了,生产上的日志级别不能修改,非常不利于排查问题,于是想到了动态修改日志打印级别, 因为上一周把项目升级成springboot2,并且使用logback.xml管理日志打印,所以修改也 ...
- java中的日志打印
java中的日志打印: 日志工具类: #获取日志 INFO:表示获取日志的等级 A1:表示日志存器,可以自定义名称 #===DEBUG INFO log4j.rootLogger=DEBUG,A1,A ...
- scarpy设置日志打印级别和存储位置
在settings.py中配置 日志级别设置 LOG_LEVEL = 'ERROR' # 当LOG_LEVEL设置为ERROR时,在进行日志打印时,只是打印ERROR级别的日志 日志存储设置 LOG_ ...
- 通过AOP拦截打印日志,出入参数
import java.lang.reflect.Modifier; import javassist.ClassClassPath; import javassist.ClassPool; impo ...
- Java编码常见的Log日志打印问题
前言 本文总结了作者在Java代码检视中遇到的一些关于日志打印的问题,并给出修改建议.因能力有限,难免存在错漏,欢迎指正. 一. 不规范的异常打印 使用slf4j日志组件时,logger.error( ...
随机推荐
- WCF Restful Post调用
一.首先建立Http的服务端,此示例的寄宿体为WindowsService,以下代码仅为WCF Restful服务代码,不包括服务启动和安装代码 1.服务契约 /// <summary> ...
- Quick 3.3 的代码资源加密
http://cn.cocos2d-x.org/tutorial/show?id=1507 http://cn.cocos2d-x.org/tutorial/show?id=1447 http://b ...
- hadoop之 HDFS fs 命令总结
版本:Hadoop 2.7.4 -- 查看hadoop fs帮助信息[root@hadp-master sbin]# hadoop fsUsage: hadoop fs [generic option ...
- python 读取Linux服务器上的文件
使用Python语句,读取Linux远端服务器上的文件打印到控制台的代码实现: 下载包:paramiko import paramiko #服务器信息,主机名(IP地址).端口号.用户名及密码 hos ...
- 在Mac和win7上分别安装了docker后,发现原来的vagrant都启动不了了
在Mac和win7上分别安装了docker后,发现原来的vagrant都启动不了了 liugx@liugx vagrant$ vagrant up /opt/vagrant/embedded/gems ...
- mysql大数据量之limit优化
背景:当数据库里面的数据达到几百万条上千万条的时候,如果要分页的时候(不过一般分页不会有这么多),如果业务要求这么做那我们需要如何解决呢?我用的本地一个自己生产的一张表有五百多万的表,来进行测试,表名 ...
- Js、jquery学习笔记
end() 方法 重新定位到上次操作的元素,一般与siblings()一起使用,操作其兄弟元素.如:$(this).addClass("highlight").children(& ...
- rtesseract的例子
这个是用来验证码识别的 需要先装一下这些 brew install Tesseract brew install imagemagick gem install rmagick 测试代码 requir ...
- Linux c- libevent
libevent是一个事件触发的网络库,适用于windows.linux.bsd等多种平台,内部使用select.epoll.kqueue等系统调用管理事件机制.著名分布式缓存软件memcached也 ...
- GOF23设计模式之适配器模式(Adapter)
一.适配器模式概述 将一个类的接口转换成客户可用的另外一个接口. 将原本不兼容不能在一起工作的类添加适配处理类,使其可以在一起工作. 二.适配器模式场景 要想只有USB接口的电脑想使用PS/2接口的键 ...