@Aspect @Component public class Log { private static Logger logger = LogManager.getLogger(Log.class); private String method; private String ip; private int port; private String host; private String url; /** * 定義切入點 */ @Pointcut("execution(public * com.angin.iit.controller..*.*(..))") public void log() { } /** * 執行方法前 獲取client參數 * * @param joinPoint */ @Before("log()") public void doBefore(JoinPoint joinPoint) { //取到request ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attributes.getRequest(); ip = request.getRemoteAddr();//客戶端ip host = request.getRemoteHost();//客戶端主機 method = request.getMethod();//客戶端請求方法 port = request.getRemotePort();//客戶端請求port url=request.getRequestURL().toString();//請求url //記錄client信息 logger.info("client:ip=" + ip + ";host=" + host + ";method=" + method + ";port=" + port+";url="+url); //類名 String classname = joinPoint.getTarget().getClass().getSimpleName(); //方法名 String methodName = joinPoint.getSignature().getName(); //參數 List<Object> args = Arrays.asList(joinPoint.getArgs()); String paraJsonString = JSON.toJSONString(args, SerializerFeature.DisableCircularReferenceDetect); //日誌記錄 類 方法 參數 logger.info("class name: " + classname + ", method name: " + methodName + ";parameters: " + paraJsonString); } /** * 方法執行 * * @param proceedingJoinPoint * @return * @throws Throwable */ @Around("log()") public Object doAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable { Object obj = proceedingJoinPoint.proceed(); logger.info("return:" + obj); return obj; } /** * 異常處理 * * @param e */ @AfterThrowing(pointcut = "log()", throwing = "e") public void doException(Throwable e) { if (e != null) { logger.error("doException系統異常:" + e.getMessage(), e); } }
以前記錄日誌的時候,都是在controller裏 每一個方法中添加,使用aop 節約了不少時間,並且維護起來更方便。url