1. 程式人生 > >Spring Controller層記錄日誌配置

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天日誌的功能,需要修改日誌記錄規則直接改配