Tomcat에서 conf/server.xml을 편집하고 org.apache.catalina.valves.AccessLogValve Valve 항목을 주석 처리하여 액세스 로깅을 활성화했습니다. POST의 페이로드 내용을 덤프 할 수 있어야합니다. 패턴의 옵션 중 하나라도이를 수행 할 것 같지 않습니다. 이 일을 할 수있는 방법이 있습니까? AccessLogValve를 사용합니까? 포스트 양식 (응용 프로그램/x를 - www가이-urlencoded를) 사용할 수 ExtendedAccessLogValve 인 경우POST의 페이로드를 Tomcat에 로깅
답변
POST 페이로드를 얻는 방법에 대한 제안이 없기 때문에 페이로드의 내용을 덤프하는 사용자 지정 필터를 작성했습니다. 특히 :
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
LOG.debug("payload: " + requestWrapper.getRequestBody());
과의 web.xml : 여기
<filter>
<filter-name>PayloadLoggingFilter</filter-name>
<filter-class>com.host.PayloadLoggingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>PayloadLoggingFilter</filter-name>
<url-pattern>/resources/*</url-pattern>
</filter-mapping>
, 당신은이 같은 패턴에서 개별 매개 변수를 선택해야
http://tomcat.apache.org/tomcat-6.0-doc/api/org/apache/catalina/valves/ExtendedAccessLogValve.html
,
x-P(param_name)
@ZZ을 : 그것은 양식을하지 않습니다 무슨 경우? –
양식이 아닌 경우 실제로 게시물 본문을 기록 할 수 없습니다. 로그 형식은 http://www.w3.org/TR/WD-logfile.html에 정의되어 있습니다. 파일 업로드의 경우, 바이너리 및 거대한 임의의 포스트 본문을 지원하지 않습니다. –
불행히도, 이것은 나에게 해당되지 않습니다. 페이로드 크기가 몇 킬로 비트 이상은 아니지만 매개 변수로 콘텐츠를 게시하지 않습니다. – Tim
참조 RequestDumperValve 또는 RequestDumperFilter : http://tomcat.apache.org/tomcat-5.5-doc/config/valve.html#Request_Dumper_Valve 당신이 원하는 것을. 당신의 웹 애플리케이션의 web.xml 추가 기능에서
RequestDumperFilter는 POST 페이로드를 기록하지 않고 머리글과 URL (쿼리 문자열 포함) 만 기록합니다. – ChristophK
:
<filter> <filter-name>PayloadLoggingFilter</filter-name> <filter-class>your.MyLogFilter</filter-class> </filter> <filter-mapping> <filter-name>PayloadLoggingFilter</filter-name> <url-pattern>/path/*</url-pattern> </filter-mapping>
이 필터 만들기 :
import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.util.Enumeration; import java.util.HashMap; import java.util.Locale; import java.util.Map; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletInputStream; import javax.servlet.ServletOutputStream; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import javax.servlet.http.HttpServletResponse; import org.apache.commons.io.output.TeeOutputStream; import com.liferay.portal.kernel.log.Log; import com.liferay.portal.kernel.log.LogFactoryUtil; import com.liferay.util.servlet.ServletInputStreamWrapper; public class MyLogFilter implements Filter { private static final Log logger = LogFactoryUtil.getLog(MyLogFilter.class); @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { try { HttpServletRequest httpServletRequest = (HttpServletRequest) request; HttpServletResponse httpServletResponse = (HttpServletResponse) response; Map<String, String> requestMap = this.getTypesafeRequestMap(httpServletRequest); BufferedRequestWrapper bufferedReqest = new BufferedRequestWrapper(httpServletRequest); BufferedResponseWrapper bufferedResponse = new BufferedResponseWrapper(httpServletResponse); chain.doFilter(bufferedReqest, bufferedResponse); if(bufferedResponse.getContent()!=null){ //Response final StringBuilder resMessage = new StringBuilder(); resMessage.append(" [RESPONSE:") .append(bufferedResponse.getContent()) .append("]"); logger.info(resMessage); } else{ //Request final StringBuilder reqMessage = new StringBuilder( "REST Request - ").append("[HTTP METHOD:") .append(httpServletRequest.getMethod()) .append("] [PATH INFO:") .append(httpServletRequest.getPathInfo()) .append("] [REQUEST PARAMETERS:").append(requestMap) .append("] [REQUEST BODY:") .append(bufferedReqest.getRequestBody()) .append("] [REMOTE ADDRESS:") .append(httpServletRequest.getRemoteAddr()).append("]"); logger.info(reqMessage); } } catch (Throwable a) { logger.error(a); } } private Map<String, String> getTypesafeRequestMap(HttpServletRequest request) { Map<String, String> typesafeRequestMap = new HashMap<String, String>(); Enumeration<?> requestParamNames = request.getParameterNames(); while (requestParamNames.hasMoreElements()) { String requestParamName = (String) requestParamNames.nextElement(); String requestParamValue = request.getParameter(requestParamName); typesafeRequestMap.put(requestParamName, requestParamValue); } return typesafeRequestMap; } @Override public void destroy() { } private static final class BufferedRequestWrapper extends HttpServletRequestWrapper { private ByteArrayInputStream bais = null; private ByteArrayOutputStream baos = null; private BufferedServletInputStream bsis = null; private byte[] buffer = null; public BufferedRequestWrapper(HttpServletRequest req) throws IOException { super(req); // Read InputStream and store its content in a buffer. InputStream is = req.getInputStream(); this.baos = new ByteArrayOutputStream(); byte buf[] = new byte[1024]; int letti; while ((letti = is.read(buf)) > 0) { this.baos.write(buf, 0, letti); } this.buffer = this.baos.toByteArray(); } @Override public ServletInputStream getInputStream() { this.bais = new ByteArrayInputStream(this.buffer); this.bsis = new BufferedServletInputStream(this.bais); return this.bsis; } @Override public BufferedReader getReader() throws IOException { return new BufferedReader(new InputStreamReader(this.getInputStream())); } String getRequestBody() throws IOException { BufferedReader reader = new BufferedReader(new InputStreamReader( this.getInputStream())); String line = null; StringBuilder inputBuffer = new StringBuilder(); do { line = reader.readLine(); if (null != line) { inputBuffer.append(line.trim()); } } while (line != null); reader.close(); return inputBuffer.toString().trim(); } } private static final class BufferedServletInputStream extends ServletInputStream { private ByteArrayInputStream bais; public BufferedServletInputStream(ByteArrayInputStream bais) { this.bais = bais; } @Override public int available() { return this.bais.available(); } @Override public int read() { return this.bais.read(); } @Override public int read(byte[] buf, int off, int len) { return this.bais.read(buf, off, len); } } public class TeeServletOutputStream extends ServletOutputStream { private final TeeOutputStream targetStream; public TeeServletOutputStream(OutputStream one, OutputStream two) { targetStream = new TeeOutputStream(one, two); } @Override public void write(int arg0) throws IOException { this.targetStream.write(arg0); } public void flush() throws IOException { super.flush(); this.targetStream.flush(); } public void close() throws IOException { super.close(); this.targetStream.close(); } } public class BufferedResponseWrapper implements HttpServletResponse { HttpServletResponse original; TeeServletOutputStream teeStream; PrintWriter teeWriter; ByteArrayOutputStream bos; public BufferedResponseWrapper(HttpServletResponse response) { original = response; } public String getContent() { if(bos == null){ return null; } return bos.toString(); } @Override public PrintWriter getWriter() throws IOException { if (this.teeWriter == null) { this.teeWriter = new PrintWriter(new OutputStreamWriter( getOutputStream())); } return this.teeWriter; } @Override public ServletOutputStream getOutputStream() throws IOException { if (teeStream == null) { bos = new ByteArrayOutputStream(); teeStream = new TeeServletOutputStream( original.getOutputStream(), bos); } return teeStream; } @Override public String getCharacterEncoding() { return original.getCharacterEncoding(); } @Override public String getContentType() { return original.getContentType(); } @Override public void setCharacterEncoding(String charset) { original.setCharacterEncoding(charset); } @Override public void setContentLength(int len) { original.setContentLength(len); } @Override public void setContentType(String type) { original.setContentType(type); } @Override public void setBufferSize(int size) { original.setBufferSize(size); } @Override public int getBufferSize() { return original.getBufferSize(); } @Override public void flushBuffer() throws IOException { if (teeStream != null) { teeStream.flush(); } if (this.teeWriter != null) { this.teeWriter.flush(); } } @Override public void resetBuffer() { original.resetBuffer(); } @Override public boolean isCommitted() { return original.isCommitted(); } @Override public void reset() { original.reset(); } @Override public void setLocale(Locale loc) { original.setLocale(loc); } @Override public Locale getLocale() { return original.getLocale(); } @Override public void addCookie(Cookie cookie) { original.addCookie(cookie); } @Override public boolean containsHeader(String name) { return original.containsHeader(name); } @Override public String encodeURL(String url) { return original.encodeURL(url); } @Override public String encodeRedirectURL(String url) { return original.encodeRedirectURL(url); } @SuppressWarnings("deprecation") @Override public String encodeUrl(String url) { return original.encodeUrl(url); } @SuppressWarnings("deprecation") @Override public String encodeRedirectUrl(String url) { return original.encodeRedirectUrl(url); } @Override public void sendError(int sc, String msg) throws IOException { original.sendError(sc, msg); } @Override public void sendError(int sc) throws IOException { original.sendError(sc); } @Override public void sendRedirect(String location) throws IOException { original.sendRedirect(location); } @Override public void setDateHeader(String name, long date) { original.setDateHeader(name, date); } @Override public void addDateHeader(String name, long date) { original.addDateHeader(name, date); } @Override public void setHeader(String name, String value) { original.setHeader(name, value); } @Override public void addHeader(String name, String value) { original.addHeader(name, value); } @Override public void setIntHeader(String name, int value) { original.setIntHeader(name, value); } @Override public void addIntHeader(String name, int value) { original.addIntHeader(name, value); } @Override public void setStatus(int sc) { original.setStatus(sc); } @SuppressWarnings("deprecation") @Override public void setStatus(int sc, String sm) { original.setStatus(sc, sm); } } }
- 1. Http Android Post의 UnKnownHostException
- 2. 패킷 페이로드를 삭제하는 도구는 무엇입니까?
- 3. 타사 스크립트에서 페이로드를 어떻게 분리합니까?
- 4. set_form_data POST의 매개 변수 이스케이프
- 5. Tomcat에 해당하는 IIS가 있습니까?
- 6. Tomcat에 게시하는 Eclipse
- 7. eclipse + Tomcat에 관한 설정
- 8. URI/foo를 Tomcat에 매핑/
- 9. Apache Tomcat에서 URL 로깅
- 10. JMeter에서 요청이있는 바이너리 페이로드를 보내는 방법은 무엇입니까?
- 11. REST 서비스가 POST 페이로드를 가져 오지 않습니다.
- 12. 로깅 호스트 이름이 CXF에서 확인되었습니다.
- 13. 로깅
- 14. 로깅
- 15. tomcat에 대한 crl 업데이트 방법
- 16. JBoss의 Tomcat에 대한 액세스 문제
- 17. 변경된 부분 만 Tomcat에 배포합니다.
- 18. FLEX3 응용 프로그램을 tomcat에 배포
- 19. tomcat에 대한 URL 다시 작성
- 20. Warbler가 만든 Tomcat을 Tomcat에 배포
- 21. tomcat에 대한 참조 문제가 있습니까?
- 22. Tomcat에 사용할 Linux 배포판은 무엇입니까?
- 23. Tomcat에 배포 할 파일은 무엇입니까?
- 24. 파이썬을 사용하여 Tomcat에 전쟁 전개하기
- 25. 로깅 어플리케이션 블록 - 호출자 로깅
- 26. REST : 무시되는 POST의 올바른 HTTP 응답 코드
- 27. iOS : HTTP POST의 responseData가 표시되지 않는 이유
- 28. Grails에서 POST의 본문 내용에 액세스하려면 어떻게해야합니까?
- 29. Android HTTP POST의 연결 유형을 선택하십시오.
- 30. 그룹 상자 위젯 (+ 사용자 POST의 STEAM)
'requestWrapper'는 어디에서 왔습니까? 아니면'요청'객체라고 생각합니까? – andho
requestWrapper는 여기에서 MyRequestWrapper라고도합니다. 그것은 작동합니다! http://natch3z.blogspot.co.uk/2009/01/read-request-body-in-filter.html – goat