Spring Controller層記錄日誌配置
主要是靠實現 ModelAndViewResolver 然後最後返回ModelAndViewResolver.UNRESOLVED
Spring 的org.springframework.web.servlet.mvc.method.annotation.ModelAndViewResolverMethodReturnValueHandler#handleReturnValue處理判斷
實現類:
package com.ruishenh.spring.test; import org.springframework.ui.ExtendedModelMap; import org.springframework.web.context.request.NativeWebRequest; import org.springframework.web.context.request.ServletWebRequest; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.annotation.ModelAndViewResolver; import javax.servlet.http.HttpServletRequest; import java.lang.reflect.Method; import java.util.HashMap; import java.util.Map; import java.util.Set; /** * Created by Administrator on 2016/1/30. */ public class MyModelAndViewResolver implements ModelAndViewResolver { /** * 支援處理多種引數邏輯 */ public static final ThreadLocal<Param> params = new ThreadLocal<Param>() { @Override protected Param initialValue() { return new Param(); } }; public ModelAndView resolveModelAndView(Method handlerMethod, Class handlerType, Object returnValue, ExtendedModelMap implicitModel, NativeWebRequest webRequest) { Class<?> declaringClass = handlerMethod.getDeclaringClass(); String clsAndMethod = declaringClass.getSimpleName() + "." + handlerMethod.getName(); HttpServletRequest request = ((ServletWebRequest) webRequest).getRequest(); //獲取請求ip Map<String, Object> parmMap = getParmMap(request); params.get().setP1(parmMap); String ip = request.getRemoteAddr(); System.out.println(clsAndMethod + "\tparam:" + params.get() + "\treturn:" + returnValue + "\tip:" + ip); params.set(new Param()); return ModelAndViewResolver.UNRESOLVED; } /** * extract a Map<string,Object> from HttpServletRequest * * @param request * @return */ public static Map<String, Object> getParmMap(HttpServletRequest request) { HashMap<String, Object> map = new HashMap<String, Object>(); @SuppressWarnings("unchecked") Map<String, Object> orimap = request.getParameterMap(); Set<String> keys = orimap.keySet(); for (String key1 : keys) { String key = key1; String[] value = (String[]) orimap.get(key); if (value.length > 1) { map.put(key, value); } else { map.put(key, value[0]); } } return map; } /** * 封裝一下引數物件,因為當json的時候是獲取不到get,post的一些servlet引數的 */ public static class Param { Object p1; Object p2; public Param() { } public Object getP1() { return p1; } public void setP1(Object p1) { this.p1 = p1; } public Object getP2() { return p2; } public void setP2(Object p2) { this.p2 = p2; } @Override public String toString() { return "Param{" + "p1=" + p1 + ", p2=" + p2 + '}'; } } }
支援json的傳送接受
package com.ruishenh.spring.test; import com.fasterxml.jackson.databind.JavaType; import org.apache.commons.io.IOUtils; import org.springframework.http.HttpInputMessage; import org.springframework.http.HttpOutputMessage; import org.springframework.http.converter.HttpMessageNotReadableException; import org.springframework.http.converter.HttpMessageNotWritableException; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import java.io.IOException; import java.lang.reflect.Type; /** * Created by Administrator on 2016/1/30. */ public class MyMappingJackson2HttpMessageConverter extends MappingJackson2HttpMessageConverter { @Override protected Object readInternal(Class<?> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException { Object o = super.readInternal(clazz, inputMessage); MyModelAndViewResolver.params.get().setP2(o);//set到 自定義的Params中去 return o; } @Override protected void writeInternal(Object object, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException { super.writeInternal(object, outputMessage); } }
Spring配置檔案
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> <property name="messageConverters"> <list> <bean class="org.springframework.http.converter.StringHttpMessageConverter"/> <bean class="com.ruishenh.spring.test.MyMappingJackson2HttpMessageConverter"/> </list> </property> <property name="customModelAndViewResolvers"> <list> <bean class="com.ruishenh.spring.test.MyModelAndViewResolver"/> </list> </property> </bean>
執行效果:
Json
POST請求json返回
Post請求 頁面返回
Console效果:
LogTestController.c param:Param{p1={}, p2=Adata{name='小明', age=20}} return:Adata{name='小明', age=20} ip:0:0:0:0:0:0:0:1
LogTestController.a param:Param{p1={age=123, name=宿舍}, p2=Adata{name='小明', age=20}} return:Adata{name='宿舍2', age=20} ip:0:0:0:0:0:0:0:1
LogTestController.b param:Param{p1={param=宿舍xxx}, p2=Adata{name='小明', age=20}} return:path ip:0:0:0:0:0:0:0:1
曾參考過這兒的配置
發現當前我們專案已經是好多人開發的東西不可能每一個method都修改所以,感覺不太合適,不過可能其他的小夥伴可能會有用
如果配置上邊不好使可能是配置:
<mvc:annotation-driven/> <mvc:default-servlet-handler/>
可以看下這個:http://blog.csdn.net/ruishenh/article/details/50629710
相關推薦
Spring Controller層記錄日誌配置
主要是靠實現 ModelAndViewResolver 然後最後返回ModelAndViewResolver.UNRESOLVED Spring 的org.springframework.web.servlet.mvc.method.annotation.ModelAn
nginx四層代理日誌配置
代理 pre ror session status con bytes war add 配置在stream段: log_format proxy ‘$remote_addr [$time_local]‘ ‘$protocol $status
spring boot 專案 部署 日誌 配置 及啟動
liunx 系統 啟動 spring boot 專案 nohup java -jar my-spring-boot.jar --spring.profiles.active=prod --spring.profiles.active=prod 指的是生產環境 n
spring aop切點記錄日誌到mongodb 註解版
package com.jk.aspectj; import java.util.Date; import javax.servlet.http.HttpServletRequest; import org.apache.commons.lang3.StringUtil
12.Spring-Boot中預設日誌配置
Spring Boot在所有內部日誌中使用Commons Logging,預設使用logbcak,但是預設配置也提供了對常用日誌的支援,如:Java Util Logging,Log4J, Log4J2和Logback。每種Logger都可以通過配置使用控制檯或者檔案輸出日誌
SpringBoot 記錄日誌配置-日期按天滾動記錄
由於SpringBoot已經封裝了日誌,我們直接在src/main/resources 下新增logback.xml即可,配置及說明如下: <?xml version="1.0" encoding="UTF-8"?> <configuration>
Spring Boot+AOP記錄日誌
1、pom.xml中加入web依賴 <dependency> <groupId>org.springframework.boot</groupId>
Spring通過切面記錄日誌
這兩天專案使用者越來越多,決定給控制層統一加上日誌,方便對出現的問題資料進行原因查詢。在加日誌的過程中遇到了一些小麻煩(如何獲取方法引數名,內容,列印到指定檔案,不再控制檯列印等),在這裡記錄一下。 首先web.xml下要不要加以下配置,看你的log4j配置檔案是不是在spring的約定位置
springAOP攔截並列印controller層請求日誌---註解方式實現
/** * Aop implementation of request log printing * * Created by wenqiangxia on 9:07 2017/10/27 */ @Component @Aspect public class Req
基於Spring AOP和Groovy日誌模板配置的日誌記錄框架的二次實現與使用案例
一、專案地址 說明:本框架是基於koala-project(專案地址:http://git.oschina.net/openkoala/koala)中的koala-businesslog二次開發,因為koala-project已經很久沒有維護,對於一些
Spring中使用Log4j記錄日誌
() 歸檔 msg 含義 多個 appenders policy rop git 以下內容引用自http://wiki.jikexueyuan.com/project/spring/logging-with-log4j.html: 例子: pom.xml: <
controller層統一攔截進行日誌處理
uuid final asp end sna ogg long lan tostring 前言 在項目中添加統一日誌時,我們往往會用到aop進行切面處理,常用在controller層添加切面,以處理請求和返回的各項參數數據。 使用切面進行日誌處理 下面我們就看一個例子說明基
在Spring的項目中配置Log4j存放日誌文件到指定目錄下
先生 tom tle -i cat path let junit測試 屬性 在Spring中使用LOG4J為日誌輸出的插件已有一段日子了,但有時候發現日誌文件雖然是已經在根據自己的理想存放了,但還會有些莫名其妙的項目日誌文件出現tomcat內(因為項目的日誌文件都以項
spring aop記錄日誌
spring aop記錄日誌 <dependency> <groupId>javassist</groupId> <artifactId>javassist</artifactId> <version>
Spring Boot中實現logback多環境日誌配置
cati feature gprof 配置 color app config 現在 ng- 在Spring Boot中,可以在logback.xml中的springProfile標簽中定義多個環境logback.xml: <springProfile name=
思科交換機配置syslog記錄日誌到syslog watcher日誌記錄軟件
inter conf sta 時間戳 date 日誌 日誌服務器 mes amp C3560#config tC3560(config)#logging onC3560(config)#logging host 192.168.210 //日誌服務器的IP地址 C3560(
Nginx配置:訪問日誌,日誌切割,靜態文件不記錄日誌和過期時間
Nginx配置 訪問日誌 一、訪問日誌 1、查看Nginx日誌格式 [root@zhulinux-02 ~]# grep -A2 log_format /usr/local/nginx/conf/nginx.conf log_format combined_realip ‘$remote_ad
nginx訪問日誌配置+日誌切割+不記錄靜態文件日誌+設置靜態文件過期時間
nginx日誌 nginx日誌切割 nginx設置靜態文件過期時間與不記錄 nginx設置日誌格式 nginx訪問日誌 查看nginx.conf文件 vim /usr/local/nginx/conf/nginx.conf 中間有一行是定義log的格式 log_format combined_
91.Nginx配置:訪問日誌,日誌切割,靜態文件不記錄日誌和過期時間
Nginx配置:訪問日誌日誌切割靜態一、訪問日誌 1、查看Nginx日誌格式 [root@sdwaqw ~]# grep -A2 log_format /usr/local/nginx/conf/nginx.conflog_format combined_realip ‘$remote_addr $http_
Python logging模塊使用配置文件記錄日誌
efm ror 我們 time BE cname image interval -h 推薦用法 在項目中推薦使用按照時間的滾動日誌記錄方式,並使用配置文件進行日誌記錄配置。這樣有很多好處:不會讓日誌文件無限變大,很容易實現保留最近N天日誌的功能,需要修改日誌記錄規則直接改配