On Tuesday 19 April 2011 1:07:19 PM Alejandro wrote:
> Hi, I'd used that you said it's doesn't works, I put the code that I used.
Can you define "doesn't work"? Does it not log anything? Is what is logged
wrong? etc...
Thinking about, I think I may have gotten confused. You want to log BEFORE
the wss4j stuff, right? In that case, you likely can just stick it in the
USER_PROTOCOL phase and not use any before/after things.
Dan
>
>
> public class LoggingOutInterceptor extends AbstractPhaseInterceptor
> {
> private static final String LOG_SETUP =
> LoggingOutInterceptor.class.getName() + ".log-setup";
>
> private static final Logger LOG =
> LogUtils.getL7dLogger(LoggingOutInterceptor.class);
>
> private int limit = 100 * 1024;
> private PrintWriter writer;
>
> public LoggingOutInterceptor(String phase)
> {
> super(phase);
> addBefore(SAAJOutEndingInterceptor.class.getName());
> }
>
> public LoggingOutInterceptor()
> {
> super(Phase.PRE_PROTOCOL_ENDING);
> addBefore(SAAJOutEndingInterceptor.class.getName());
> }
>
> public LoggingOutInterceptor(int lim)
> {
> this();
> limit = lim;
> }
>
> public LoggingOutInterceptor(PrintWriter w)
> {
> this();
> this.writer = w;
> }
>
> public void setLimit(int lim)
> {
> limit = lim;
> }
>
> public int getLimit()
> {
> return limit;
> }
>
> public void handleMessage(Message message) throws Fault
> {
> final CachedOutputStream os = new CachedOutputStream();
> SOAPMessage is = message.getContent(SOAPMessage.class);
> if (is == null)
> {
> return;
> }
>
> try
> {
> is.writeTo(os);
> }
> catch (SOAPException e)
> {
> return;
> }
> catch (IOException e)
> {
> return;
> }
>
> if (LOG.isLoggable(Level.INFO) || writer != null)
> {
> // Write the output while caching it for the log message
> boolean hasLogged = message.containsKey(LOG_SETUP);
> if (!hasLogged)
> {
> message.put(LOG_SETUP, Boolean.TRUE);
> final CacheAndWriteOutputStream newOut = new
> CacheAndWriteOutputStream(os);
> message.setContent(OutputStream.class, newOut);
> newOut.registerCallback(new
> LoggingCallback(message, os));
> }
> }
> }
>
> /**
> * Transform the string before display. The implementation in this class
> * does nothing. Override this method if you want to change the contents
> of * the logged message before it is delivered to the output. For example,
> you
> * can use this to masking out sensitive information.
> *
> * @param originalLogString
> * the raw log message.
> * @return transformed data
> */
> protected String transform(String originalLogString)
> {
> return originalLogString;
> }
>
> class LoggingCallback implements CachedOutputStreamCallback
> {
>
> private final Message message;
> private final OutputStream origStream;
>
> public LoggingCallback(final Message msg, final OutputStream os)
> {
> this.message = msg;
> this.origStream = os;
> }
>
> public void onFlush(CachedOutputStream cos)
> {
>
> }
>
> public void onClose(CachedOutputStream cos)
> {
> String id =
(String)message.getExchange().get(LoggingMessage.ID_KEY);
> if (id == null)
> {
> id = LoggingMessage.nextId();
>
> message.getExchange().put(LoggingMessage.ID_KEY, id);
> }
> final LoggingMessage buffer = new
> LoggingMessage("Outbound
> Message\n---------------------------", id);
>
> Integer responseCode =
(Integer)message.get(Message.RESPONSE_CODE);
> if (responseCode != null)
> {
> buffer.getResponseCode().append(responseCode);
> }
>
> String encoding = (String)message.get(Message.ENCODING);
>
> if (encoding != null)
> {
> buffer.getEncoding().append(encoding);
> }
>
> String address =
> (String)message.get(Message.ENDPOINT_ADDRESS);
> if (address != null)
> {
> buffer.getAddress().append(address);
> }
> String ct = (String)message.get(Message.CONTENT_TYPE);
> if (ct != null)
> {
> buffer.getContentType().append(ct);
> }
> Object headers = message.get(Message.PROTOCOL_HEADERS);
> if (headers != null)
> {
> buffer.getHeader().append(headers);
> }
>
> if (cos.getTempFile() == null)
> {
> // buffer.append("Outbound Message:\n");
> if (cos.size() > limit)
> {
> buffer.getMessage().append("(message
> truncated to " +
limit + "
> bytes)\n");
> }
> }
> else
> {
> buffer.getMessage().append("Outbound Message
> (saved to tmp
file):\n");
> buffer.getMessage().append("Filename: " +
> cos.getTempFile().getAbsolutePath() + "\n");
> if (cos.size() > limit)
> {
> buffer.getMessage().append("(message
> truncated to " +
limit + "
> bytes)\n");
> }
> }
> try
> {
> cos.writeCacheTo(buffer.getPayload(), limit);
> }
> catch (Exception ex)
> {
> // ignore
> }
>
> if (writer != null)
> {
> writer.println(transform(buffer.toString()));
> }
> else if (LOG.isLoggable(Level.INFO))
> {
> LOG.info(transform(buffer.toString()));
> }
> try
> {
> // empty out the cache
> cos.lockOutputStream();
> cos.resetOut(null, false);
> }
> catch (Exception ex)
> {
> // ignore
> }
> message.setContent(OutputStream.class, origStream);
> }
> }
>
> }
>
> Regards
>
> --
> View this message in context:
> http://cxf.547215.n5.nabble.com/Log-SoapMessage-After-WSS4J-tp4305812p4313
> 815.html Sent from the cxf-user mailing list archive at Nabble.com.
--
Daniel Kulp
[email protected]
http://dankulp.com/blog
Talend - http://www.talend.com