使用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中獲取當前用戶就可以了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM