1. 程式人生 > >springboot使用AOP列印日誌資訊

springboot使用AOP列印日誌資訊

上一篇介紹了springboot整合Mybatis例子,這一篇在上一篇的基礎上,簡單修改部分實現日誌資訊的列印。

隨著專案功能的一點點增加,列印日誌資訊就非常必要了,可以幫助我們很快確定哪裡出現了問題,這裡使用slf4j來列印日誌。

AOP即面向切面程式設計,通過預編譯方式和執行期動態代理實現程式功能的統一維護的一種技術。如果幾個或更多個邏輯過程中,有重複的操作行為,AOP就可以提取出來,運用動態代理,實現程式功能的統一維護,這樣就非常方便了,在實現主業務過程中無需為一些零碎的但必不可少的旁支功能打擾,而是後期橫切進去,這裡接上一篇的程式碼來做,可以看出這個特點,對上一篇的程式碼沒有做任何修改而成功打印出所需要的日誌資訊。關於AOP的更多知識,可以參考:

理解Spring中的IOC和AOP。

首先,引入AOP的依賴包

<dependency>  
   	<groupId>org.springframework.boot</groupId>  
   	<artifactId>spring-boot-starter-aop</artifactId>  
</dependency> 

新建一個HttpAspect類,放在aspect包下:
package org.amuxia.aspect;

import javax.servlet.http.HttpServletRequest;

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;

@Aspect
@Component
public class HttpAspect {
	private Logger logger = LoggerFactory.getLogger(this.getClass());
	
	@Pointcut("execution(public * org.amuxia.controller.ItemsController1.*(..))")
    public void myLog() {
    }
	
	@Before("myLog()")
	public void reqMessage() {
		ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        logger.info("*********列印請求資訊開始**********");
		logger.info("URL : " + request.getRequestURL().toString());
        logger.info("HTTP_METHOD : " + request.getMethod());
        logger.info("*********列印請求資訊結束**********");
	}
	
	@AfterReturning(returning="object",pointcut="myLog()")
	public void resMessage(Object object) {
		 logger.info("*********列印結果資訊開始**********");
		 logger.info("RESULT:"+ object);
		 logger.info("*********列印結果資訊結束**********");
	}
	
	
}

就這樣,其餘程式碼都不變,我們執行之後,輸入http://localhost:8080/items1/list,控制檯顯示列印資訊如下:
2017-12-24 16:59:41.070  INFO 6376 --- [nio-8080-exec-1] org.amuxia.aspect.HttpAspect             
: *********列印請求資訊開始**********
2017-12-24 16:59:41.070  INFO 6376 --- [nio-8080-exec-1] org.amuxia.aspect.HttpAspect             
: URL : http://localhost:8080/items1/list
2017-12-24 16:59:41.070  INFO 6376 --- [nio-8080-exec-1] org.amuxia.aspect.HttpAspect             
: HTTP_METHOD : GET
2017-12-24 16:59:41.070  INFO 6376 --- [nio-8080-exec-1] org.amuxia.aspect.HttpAspect             
: *********列印請求資訊結束**********
2017-12-24 16:59:41.373  INFO 6376 --- [nio-8080-exec-1] org.amuxia.aspect.HttpAspect             
: *********列印結果資訊開始**********
2017-12-24 16:59:41.373  INFO 6376 --- [nio-8080-exec-1] org.amuxia.aspect.HttpAspect             
: RESULT:ModelAndView: reference to view with name 'items'; 
model is {list=[Items [id=1, title=學習springboot, name=阿木俠, detail=說點兒什麼呢], 
Items [id=2, title=我是一個標題, name=阿木俠, detail=我是內容,寫點兒什麼好呢], 
Items [id=3, title=我也是標題, name=阿木俠, detail=荷塘啊荷塘], 
Items [id=4, title=修改後的標題, name=amuxia, detail=修改後的內容], 
Items [id=6, title=這是新增的標題, name=阿木俠, detail=這是新增的內容], 
Items [id=13, title=花開花謝, name=花酒, detail=悽悽慘慘慼戚]]}
2017-12-24 16:59:41.373  INFO 6376 --- [nio-8080-exec-1] org.amuxia.aspect.HttpAspect             
: *********列印結果資訊結束**********

我們可以看到,已經成功將執行日誌打印出來了。

程式碼不多,都非常容易理解,下面對上面用到的一些註解進行簡單的介紹:

@Aspect    作用是把當前類標識為一個切面供容器讀取。

@Before     標識一個前置增強方法,相當於BeforeAdvice的功能,從切入點開始處切入內容。

@AfterReturning      後置增強,相當於AfterReturningAdvice,方法正常退出時執行。

@Pointcut      定義一個切入點,可以是一個規則表示式,也可以是一個註解等。

相關推薦

springboot使用AOP列印日誌資訊

上一篇介紹了springboot整合Mybatis例子,這一篇在上一篇的基礎上,簡單修改部分實現日誌資訊的列印。隨著專案功能的一點點增加,列印日誌資訊就非常必要了,可以幫助我們很快確定哪裡出現了問題,這

spring boot 列印mybatis sql日誌資訊

如果使用的是application.properties檔案,加入如下配置: logging.level.com.example.demo.dao=debug logging.level.com,後面的路徑指的是mybatis對應的方法介面所在的包。並不是mapper.xml所在的包。

log4j配置失效日誌列印Debug資訊

最近釋出專案的時候發現控制檯列印的日誌較往常多了很多,仔細一看,debug和info資訊也赫然在列,開啟log4j.xml配置檔案看一下: <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration

springMVC列印請求資訊日誌,如請求頭,請求體,請求路徑等

處理類LoggingFilter : package com.zqsign.app.privatearbitrate.interceptor; import java.io.BufferedReader; import java.io.IOException;

ZipKin原理學習--zipkin支援日誌列印追蹤資訊

       目前在zipkin brave已經提供功能在我們使用logback或log4j等時可以在日誌資訊中將traceId和spanId等資訊列印到執行日誌,這樣可能對我們通過日誌檢視解決問題有比較大的幫助。 示例: pom.xml中新增zipkin相關ja

java如何用LOG列印日誌並輸出資訊到檔案中

使用log4j.jar。log4j 是apache 提供的記錄日誌的jar 檔。 除了這個包外,還需要另一個jar包:.commons-logging.jar commons-logging.jar是配合log4j.jar列印輸出日誌必備的jar包。 下面我們就

springboot 專案中thymleaf在控制檯輸出了一大堆資訊。。如何控制使用thymeleaf不在控制檯列印日誌

之前另外一個部落格裡說在pom里加入: 我試了一下,這樣不行,後來在stackoverflow問了,解決方案如下: 在application.yml裡面設定: logging:     level:        org.thymeleaf: info

JAVA 日誌異常沒有列印堆疊資訊問題

在生產環境中異常資訊沒有堆疊資訊的異常2018-06-23 12:10:00.029 [ threadPoolTaskScheduler-10 ] - [ ERROR ] [ com.vanvov.hms.exception.SchedulerErrorHandler : 2

tomcat列印詳細日誌資訊

Tomcat後臺資訊太少以至於不能得出問題空間出在哪兒(Tomcat的日誌目錄也無相關資訊)。網上查詢得知,通過配置Tomcat的Log,讓它記錄更多的日誌資訊,方能進一步分析原因。 在不能啟動的Web應用目錄(我這裡是st)下WEB-INF/classes目錄中,新建logging.properties檔案

springmvc和springboot分別設定攔截器,列印記憶體資訊,訪問時間等日誌資訊

SpringMVC提供了一個攔截器介面供我們呼叫:HandlerInterceptor,這個介面有三個待實現的方法: preHandle方法 進入 Handler方法之前執行 用於身份認證、身份授權 比如身份認證,如果認證不通

如何通過配置log4j.xml來列印指定類或指定級別的日誌資訊

把指定類的日誌資訊輸出到指定appender裡: ============================================================ <!--appender中,Theshold和Filter都是可選。不過,建議這種目的下最好不要寫,這樣,什麼資訊會輸出到該app

Flask日誌資訊列印如何改變位置

在Flask框架中,每處理完一條請求,都會在終端打印出一條請求的日誌資訊: 127.0.0.1 - - [31/May/2018 04:40:35] "POST /xxx/xxx/xxx HTTP/1.1" 200 - 之所以列印了這條日誌資訊,是因為Fl

把log4j的日誌資訊列印到swing元件上

網上有很多把system的資訊列印到swing的元件上的,這個就不說了。但是預設情況下log4j的是列印不到的。那怎麼辦呢,肯定首先要做到還是讓system的資訊列印到swing,接著再來操作這個步驟: 為自己應用程式的輸出控制檯還是不錯的。有個問題,如果要捕獲 Log4J

列印 Action (Controller )層的日誌資訊

目的:通過 Spring 的 AOP 特性,對所有的 Action (Controller )層增加前置通知,以觀察前臺如何請求後臺資料(可以看到請求順序、引數分別是什麼)。 所用技術: AOP 、s

關於unity的日誌資訊列印

– 1.釋出專案 2.勾選Development BUild 和Script Debugging 3.點選Open Log File 就能顯示出列印錯誤資訊的資料夾 檔案點選另存為就能查詢到存放列印文字資訊的目錄了 Development

tomcat中多個專案(web專案)共用log4j.jar的情況下,如何讓其各自列印各自的日誌檔案。及輸出同級別日誌資訊

問題描述: 1.專案A中有一個log4j.properties(配置為把日誌輸出到以專案名稱命名的資料夾中)  2.為了減輕tomcat負擔,把專案A的WEB-INF/lib下的所有jar檔案拷貝到tomcat下的lib中並修改catalina.properties對其載入

LR做介面壓力測試時,後臺列印日誌的異常資訊

一、環境:tomcat         應用:web service 介面(java) 二、LR 11、Cent Os 三、併發人數5人,不做遞度設定,不設定 思考時間 ,設定PACING 為隨機1秒至2秒 四、TOMCAT日誌列印的資訊: 警告: Intercepto

log4j日誌資訊列印(含檔案)

日誌檔案的列印以下步驟即可 1. 引入相關的檔案 import org.slf4j.Logger; import org.slf4j.LoggerFactory; private stati

如何列印完整的MYSQL帶引數SQL日誌資訊

在mysql的jdbc中開啟sql分析,如下: jdbc.url=jdbc:mysql://127.0.0.1/test?useUnicode=true&characterEncoding=UTF-8&useLegacyDatetimeCode=false&serverTimezon

AliOS-Things--linkkitapp (6)列印日誌

設定日誌水平: EXAMPLE_TRACE("linkkit start"); /* * linkkit start * max_buffered_msg = 16, set the handle msg max numbers. *