Я имел хороший успех и анализирующие и пишущие файлы CSV от Java с OpenCSV. Если Вы хотите прочитать или записать Excel совместимую электронную таблицу с Java, , библиотека POI от Apache является способом пойти.
Мне удалось зарегистрировать весь трафик SSL, реализовав мою собственную SSLSocketFactory поверх стандартной.
Это сработало для меня, потому что все наши подключения используют HTTPS, и мы можем установить фабрику сокетов с помощью метода HttpsURLConnection.setSSLSocketFactory .
Более полное решение, позволяющее осуществлять мониторинг всех сокетов, можно найти на http://www.javaspecialists.eu/archive/Issue169.html Спасибо Лоуренсу Долу для указания правильного направления использования Socket.setSocketImplFactory
Вот мой не готовый к производству код:
public class WireLogSSLSocketFactory extends SSLSocketFactory {
private SSLSocketFactory delegate;
public WireLogSSLSocketFactory(SSLSocketFactory sf0) {
this.delegate = sf0;
}
public Socket createSocket(Socket s, String host, int port,
boolean autoClose) throws IOException {
return new WireLogSocket((SSLSocket) delegate.createSocket(s, host, port, autoClose));
}
/*
...
*/
private static class WireLogSocket extends SSLSocket {
private SSLSocket delegate;
public WireLogSocket(SSLSocket s) {
this.delegate = s;
}
public OutputStream getOutputStream() throws IOException {
return new LoggingOutputStream(delegate.getOutputStream());
}
/*
...
*/
private static class LoggingOutputStream extends FilterOutputStream {
private static final Logger logger = Logger.getLogger(WireLogSocket.LoggingOutputStream.class);
//I'm using a fixed charset because my app always uses the same.
private static final String CHARSET = "ISO-8859-1";
private StringBuffer sb = new StringBuffer();
public LoggingOutputStream(OutputStream out) {
super(out);
}
public void write(byte[] b, int off, int len)
throws IOException {
sb.append(new String(b, off, len, CHARSET));
logger.info("\n" + sb.toString());
out.write(b, off, len);
}
public void write(int b) throws IOException {
sb.append(b);
logger.info("\n" + sb.toString());
out.write(b);
}
public void close() throws IOException {
logger.info("\n" + sb.toString());
super.close();
}
}
}
}
Я не думаю, что вы можете сделать это автоматически, но вы можете создать подкласс FilterOutputStream и FilterInputStream с помощью HttpUrlConnection
' s выходные и входные потоки в качестве параметров. Затем, когда байты записываются / читаются, регистрировать их, а также передавать в базовые потоки.
Решение №1: Используйте шаблон декоратора
. Вам нужно будет использовать шаблон декоратора в классе HttpURLConnection чтобы расширить его функциональность. Затем переопределите все методы HttpURLConnection и делегируйте операцию указателю компонента, а также запишите необходимую информацию и запишите ее.
Также убедитесь, что вы переопределили родительский класс URLConnection.getOutputStream () : OutputStream и URLConnection.html # getInputStream () : InputStream методы для возврата декорированных объектов OutputStream и InputStream .
.
Решение №2: Используйте собственный HTTP-прокси в памяти
Напишите простой HTTP-прокси-сервер и запустите его в отдельном потоке во время запуска и инициализации приложения. См. Пример простого прокси-сервера .
Настройте свое приложение на использование указанного выше HTTP-прокси для всех ваших запросов. См. настройка Java для использования прокси .
Теперь весь ваш трафик проходит через прокси-сервер, как это происходит в скрипте. Следовательно у вас есть доступ к необработанному потоку http «от клиента к серверу», а также «обратно от сервера к клиенту». Вам придется интерпретировать эту необработанную информацию и при необходимости регистрировать ее.
Обновление: Использовать прокси-сервер HTTP в качестве адаптера к веб-серверу на основе SSL.
== Client System ===============================
| |
| ------------------------------ |
| | | |
| | Java process | |
| | ---- | |
| | ---------- | | | |
| | | | -O | | |
| | | Logging | | | |
| | | Proxy <---HTTP-- | ----- |
| | | Adapter | | | | |
| | | Thread o------------------> | |
| | | o | | | | |
| | --------|- | | Log | |
| | | | ----- |
| ----------------|------------- |
| | |
=====================|==========================
|
|
HTTPS
SSL
|
== Server System ====|==========================
| | |
| ----------------|---------------- |
| | V | |
| | | |
| | Web Server | |
| | | |
| --------------------------------- |
| |
================================================
Как насчет использования AspectJ для вставки Pointcut, чтобы добавить рекомендации по ведению журнала вокруг метода? Я считаю, что AspectJ может вплести его в частные / защищенные методы.
Похоже, что sun.net.www.protocol.http.HttpURLConnection.writeRequest может вызывать sun.net.www.http.HttpClient.writeRequest, который принимает объект MessageHeader в качестве входных данных, так что это будет ваша цель.
В конце концов, это может сработать, но будет очень хрупким и будет работать только на Sun JVM; и на самом деле вы можете доверять только той версии, которую используете.
Если вас интересует только содержимое сети (заголовки, тело и т. Д.), Вы можете попробовать wirehark .
Это дает то преимущество, что вам не нужно изменять какой-либо код, хотя, если вы хотели включить ведение журнала через код, этот ответ неприменим.