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( ...
随机推荐
- pandas 之 set_index
set_index 很有用 http://stackoverflow.com/questions/10457584/redefining-the-index-in-a-pandas-dataframe ...
- MEF学习总结(2)---Primitive层
Primitive层是属于依赖注入的通用模型,主要有如下核心类型: 1. ComposablePart是核心类,他表示组件容器中的每一个组件,是对真正组件实例的包装.ExportDefinition属 ...
- java指定文件编码格式
在创建文件并打印字符串时,如果不指定编码,默认是按系统的编码格式来.比如我们的linux环境中编码如下: CMREAD-SV43 /home/wlf> locale LANG=en_US.UTF ...
- ShowDialog窗体的return问题
最近的一个项目里,打开新窗口用到了ShowDialog()这种方式,发现在新窗口做保存操作的时候,保存按钮事件下的程序执行完(无论有没有return)都会关闭子窗口. 网上查了一下,发现大家说的方法在 ...
- mac链接linux
连接 : ssh 用户名@主机名 -- ssh -p 22 root@47.98.164.34 上传: scp 要上传的文件名称 用户名@主机名:上传到的路径 下载: scp 用户名@主 ...
- idea 类注释,方法注释设置
类头注释:打开file->setting->Editor->Filr and Code Templates->Includes->File Header 直接在右边的文件 ...
- DataTable 树形构造加全部
DataTable dtGx = new DataTable(); dtGx = SqlHelper.SqlGetDataTable(StrSql, "tbUserGx"); th ...
- HTML4 And HTML5 标签整理
一.文字备忘之标签 HTML5中新增的标签<article> 定义文章 <aside> 定义页面内容旁边的内容 <audio> ...
- HDU2546题解
解题思路:先对价格排序(顺序或倒序都可以),然后,对前n-1(从1开始.排序方式为顺序)做容量为m(卡上余额)-5的01背包(背包体积和价值相等).假设dp[i][j]表示从前i个背包中挑选体积不超过 ...
- c++ 搜索二叉树 插入,删除,遍历操作
搜索二叉树是一种具有良好排序和查找性能的二叉树数据结构,包括多种操作,本篇只介绍插入,排序(遍历),和删除操作,重点是删除操作比较复杂,用到的例子也是本人亲自画的 用到的测试图数据例子 第一.构建节点 ...