简体   繁体   中英

Stop Apache CXF logging binary data of MultipartBody attachments

I need to stop CXF from logging the binary data of attachments in a MultipartBody object (which is being thrown out by the AbstractLoggingInterceptor in the Outbound Message). When I add my LoggingInInterceptor , I am setting setShowBinaryData to false, but this doesn't seem to stop binary data within a multipart message from being logged.

I am unsure whether I need to create a custom loggingInInterceptor, or whether there is a way of configuring the existing interceptors to truncate any binary data it finds. Stopping it logging the MultipartBody response entirely, or truncating the data are both acceptable solutions.

showBinaryContent by default is false, however binary data gets logged based on content type, Currently if your content type is not any of the following; the binary data would be logged.

static {
        BINARY_CONTENT_MEDIA_TYPES = new ArrayList<String>();
        BINARY_CONTENT_MEDIA_TYPES.add("application/octet-stream");
        BINARY_CONTENT_MEDIA_TYPES.add("image/png");
        BINARY_CONTENT_MEDIA_TYPES.add("image/jpeg");
        BINARY_CONTENT_MEDIA_TYPES.add("image/gif");
    }

Say your content type is application/zip , you can Create Custom Interceptor and override isBinaryContent as shown below

import org.apache.commons.lang3.StringUtils;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.interceptor.LoggingMessage;

public class KPLogOutInterceptor extends LoggingOutInterceptor {

    @Override
    public boolean isBinaryContent(String contentType) {
        return contentType != null && (BINARY_CONTENT_MEDIA_TYPES.contains(contentType)|| "application/zip".equals(contentType);
    }
}

Another way without using content type is as shown below.

import org.apache.commons.lang3.StringUtils;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.interceptor.LoggingMessage;

public class KPLogOutInterceptor extends LoggingOutInterceptor {

    @Override
    protected String formatLoggingMessage(LoggingMessage loggingMessage) {

        return removePayload(loggingMessage.toString()); 
    }


    private String removePayload(String str){

        StringBuilder builder = new StringBuilder(str);
        if (str.indexOf("Payload:") + 9 > 8) {
            builder.setLength(builder.indexOf("Payload:") + 8);
            builder.append(" <content skipped>\n");
            builder.append(StringUtils.repeat('-', 25));
        }
        return builder.toString();  
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM