springMVC,aop管理log4j,把当前session信息和错误信息打印到日志
((((其實還是不太理解aop的正真意義但是這樣可以實現想要的了,我的感覺是執行一個方法時首先通過filter( 這個fiter可以不配置,之所以要他是因為在aop切入的方法session消失了,我們要保存是誰在操作就需要他) > aop管理的log4j類,>log4j 來搞定日志的處理))))
記錄一下學習路徑,終于搞通了關于spring aop管理log4j和有關session的問題,目的是 當某個用戶進行什么操作發生了什么異常,記錄到日志以備查找錯誤進行修改,參考文檔:http://blog.csdn.net/sorrow199117/article/details/8848505 這位大神寫的我從頭一直做到尾,但是就是獲取不到session,如果沒有用戶信息記錄不了用戶就沒什么意義了,繼續調試,我靠 ,最后發現是緩存的問題,清理了服務器問題解決,借用大神的一句話:AOP配置文件會去檢查你是否對此方法配置了日志切面,如果配置了,這兒是后向切入,他會在執行此方法之后執行切入類的一個方法(AOP配置此方法),切入類得到了此方法的完整路徑名稱,他會到一個配置文件中去讀取方法描述,然后用log4j記錄此描述信息
1. spring的配置文件 XXX.xml ,aop配置代碼段
2.下面是web.xml配置log4j 的主要部分 當啟動項目時加載
我把log4j.properties配置文件放在源文件夾下logs/XXX 目錄下編譯之后的路徑是WEB-INF/classes/logs/XXXX
<!--*******log4j日志信息的配置--><context-param><param-name>log4jConfigLocation</param-name><param-value>classpath:logs/log4j.properties</param-value></context-param><!--Spring默認刷新Log4j配置文件的間隔,單位為millisecond,可以不設置 --> <context-param> <param-name>log4jRefreshInterval</param-name> <param-value>60000</param-value> </context-param> <!-- Filter : GetUserFilter 他的作用是從SESSION中獲取當前登錄用戶的信息,在Log4j配置文件中用到了,比如%X{name}是獲取用戶姓名,但是要在此Filter中先設置name屬性。GetUserFilter是關鍵所在,因為等一下用AOP切入的方法已經得不到用戶信息了,就要靠他了 --><filter> <filter-name>GetUserFilter</filter-name> <filter-class>com.esh.eatsong.framework.util.GetUserFilter</filter-class> </filter> <filter-mapping> <filter-name>GetUserFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> log4j.properties 配置文件? 這個文件但是搞了半天才明白這些類似與C 的代碼是什么意思不知道的可以參考:http://zc2690790.blog.163.com/blog/static/127891478200981445953120/
制造一個error異常
package com.esh.framework.util;import java.lang.reflect.Method;import org.apache.log4j.Logger; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.AfterThrowing; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.springframework.stereotype.Component;/*** 基于注解的AOP日志示例* @author */ @Component @Aspect public class AopLog {/** * 必須為final String類型的,注解里要使用的變量只能是靜態常量類型的 */ private static final String EDP = "execution (* com.esh.eatsong.customServer.*.*.impl.*.*(..))";private static final Logger logger = Logger.getLogger(Log4jAspect.class);private static final String DOT = ".";//點號private static final String COMMA = ",";//逗號String strLog = null ; /** * 前置通知:在某連接點之前執行的通知,但這個通知不能阻止連接點前的執行 * @param jp 連接點:程序執行過程中的某一行為,例如,AServiceImpl.barA()的調用或者拋出的異常行為 */ public void doBefore(JoinPoint jp) { strLog = "log Begining method: " + jp.getTarget().getClass().getName() + "." + jp.getSignature().getName(); logger.warn(strLog); } /** * 拋出異常后通知 : 在方法拋出異常退出時執行的通知。 * @param jp 連接點:程序執行過程中的某一行為,例如,AServiceImpl.barA()的調用或者拋出的異常行為 */ public void doAfter(JoinPoint jp) { strLog ="doAfter:log Ending method: " + jp.getTarget().getClass().getName() + "." + jp.getSignature().getName(); logger.warn(strLog); } /** * 環繞通知:包圍一個連接點的通知,可以在方法的調用前后完成自定義的行為,也可以選擇不執行 * 類似Web中Servlet規范中的Filter的doFilter方法。 * @param pjp 當前進程中的連接點 * @return * @throws Throwable */ @Around(EDP)public Object rround(ProceedingJoinPoint joinPoint) throws Throwable {StringBuilder sb = new StringBuilder();Object[] paramValues = joinPoint.getArgs();//獲取參數值String[] paramNames = new String[paramValues.length];Class<? extends Object> invokeClass = joinPoint.getTarget().getClass();String signatureName = joinPoint.getSignature().getName();Method methods[] = invokeClass.getMethods();for (Method method : methods) {if(method.getName().equals(signatureName)) {String paramCollection ="";AOPLog4jAnnotation log4jAnnotation = method.getAnnotation(AOPLog4jAnnotation.class);if(log4jAnnotation!=null){paramCollection=log4jAnnotation.paramCollection();//獲取注解值String[] names = paramCollection.split(COMMA);System.arraycopy(names, 0, paramNames, 0, names.length);}else{;}}}for (int i = 0; i < paramValues.length; i++) {sb.append(paramNames[i] + "=" + paramValues[i] + COMMA);}//入參日志if(sb.length()!=0){logger.info(invokeClass + DOT + signatureName + ",remote input:" + sb.toString().substring(0, sb.length() - 1)); }Object result = joinPoint.proceed();//出參日志logger.info(invokeClass + DOT + signatureName + ",remote output:" + result);return result;}//方法運行出現異常時調用@AfterThrowing(pointcut = EDP,throwing = "ex")public void afterThrowing(JoinPoint jp, Exception ex){strLog ="afterThrowing:log Ending method: " + jp.getTarget().getClass().getName() + DOT + jp.getSignature().getName(); logger.error(strLog+"["+ex+"]");} }
web項目日志輸出文件在服務器根目錄下 然后跟路徑/X/X/XX/filter.log
高度關注filter.log 這里存放了session信息
總結
以上是生活随笔為你收集整理的springMVC,aop管理log4j,把当前session信息和错误信息打印到日志的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【小白学习PyTorch教程】五、在 P
- 下一篇: 【机器学习】一文速览机器学习的类别(Py