HTTPClient Debug Log

  • Antworten:14
  • Bentwortet
Mac Systems
  • Forum-Beiträge: 1.727

09.07.2010, 17:59:54 via Website

Hallo,

hat jemand von euch unter Android den HTTPClient schon zum Debug Loggen gebracht wie es hier beschrieben ist ?

http://hc.apache.org/httpclient-3.x/logging.html

Dies scheint nicht mehr zu funktionieren.

Wie komme Ich an die Ausgaben ran ?

mfg,
Mac

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

28.01.2011, 11:02:58 via Website

Jemand ne Idee ?

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

28.01.2011, 11:31:25 via Website

Guck mal hier http://download.oracle.com/javase/1.4.2/docs/guide/jar/jar.html#Provider%20Configuration%20File
Das ganze läuft ja über das ServiceProvider Modell und der Logger zieht sich den Logger, der im Classpath als Logger installiert ist.
Das kann entweder im META-INF der jars deklariert werden, oder halt explizit im Programm.

Das sollte ja auch unter Android gehen.

Jetzt nur mal so als Ansatz :)

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

28.01.2011, 11:51:19 via Website

Du meinst die supporten unter Android weiterhin Commos Logging sowie Log4j ? Finde ich arg overkill auf den ersten blick, zumal hier eh seitens Google einige änderungen vorgenommen wurden.

Das Logging selbst über das ServiceProvider Interface läuft wäre mit irgendwie neu. Ich kenne das eher in dem Context das man z.b NIO erweitern kann oder die Sound API in SE.

Nutzte Ich den Java SE 6 und HTTP Client 4 reicht dies vollkommen aus:

System.setProperty("org.apache.commons.logging.Log","org.apache.commons.logging.impl.SimpleLog");
System.setProperty("org.apache.commons.logging.simplelog.log.org.apache.http","DEBUG");

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

28.01.2011, 12:01:33 via Website

Du kannst über die Service Provider auch XML Parser deklarieren und allen möglichen andren Schnick-Schnack.
So kannst Du z.B. dafür sorgen, dass dein Programm garantiert einen bestimmten Parser benutzt, der beispielsweise ein speziellen Feature hat wie Validierung.
Logging auch, siehe: http://maven.40175.n5.nabble.com/WEB-INF-classes-META-INF-td106966.html

IMHO müsstest du also nur eine Logger-Implementierung deiner Wahl als jar mit in dein Projekt aufnehmen und dafür sorgen, dass sie sich als LoggerServiceProvider registriert.
Das könnten evtl. sogar schon im META-INF Verzeichnis der Logger Implementiertung der Fall sein (wobei ich nicht weiss ob Android das beachtet).
Oder wenn nicht, könntest Du es wohl manuell im Java Code machen.

— geändert am 28.01.2011, 12:02:23

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

28.01.2011, 12:12:03 via Website

Bei den XML Parsern ist das klar (unter Standart SE).

Habe mir commons-logging-1.1.1.jar mal angeschaut, es gibt kein META_INF/Service dort, wie ich es mir schon dachte, die JVM würde dort in dem Falle nachschauen, was Android macht weiß ich nicht.

Das scheint der Holzweg zu sein, zu dem Thema gibt es von meiner Suche her keine Antworten, strange wie ich finde, bin ich der einzige der wissen will was der HttpClient macht ?

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

28.01.2011, 12:36:39 via Website

Woher willst du das wissen das es funtzt ?

Also mir reicht es aus, dass er funktioniert ;-)

Bis du ein Problem hast ;)

Habe die commons logging in das Android Projekt geworfen, dx meckert das die Class version einiger Commons Classes nicht simmt,
kA was da los ist.

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

28.01.2011, 12:46:19 via Website

Ich hatte ein Problem :)
Das konnte ich dank eines übermittelten StackTrace aber nachvollziehen und abstellen.
Da hat das ConnectionPooling Probleme bereitet und in bestimmten Fällen haben Connections ihren Kontext verloren und Exceptions geworfen, wenn er versucht hat sie wiederzuverwenden.

Zum Logging:
Ich würde mal das Logger-jar entpacken und die services Deklaration selbst einfügen, dann wieder zusammenpacken.
Soweit ich weiss sind die Apache jars nicht signiert, so dass er das schlucken müsste.

Oder evtl. ins META-INF des Android Projekts? Oder evtl. selbst im Quellcode den Provider registrieren?
Dann eine Konfiguration für den jeweiligen Logger hinterlegen, die in die Konsole loggt und auf DEBUG stellen.
Da der HTTPClient auf den Logger als Provider zugreift, findet er solange keinen, bis einer deklariert wird.
Sobald du also einen deklarierst, müsste er fröhlich losloggen.

Wenn man es im Quellcode macht, müsste man den Provider natürlich vor dem ersten Aufruf einer HTTPClient Klasse deklarieren, weil ich vermute, dass die Logger statisch gehalten werden und schon beim Laden der Klasse initialisiert werden.

— geändert am 28.01.2011, 12:47:42

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

28.01.2011, 13:09:09 via Website

Habe mir mal ein release mittels GIT geholt und nachgeschaut, und frage mich wie das gehen soll ?

Class Headers.java in auszügen:

public void parseHeader(CharArrayBuffer buffer) {
int pos = CharArrayBuffers.setLowercaseIndexOf(buffer, ':');
if (pos == -1) {
return;
}
String name = buffer.substringTrimmed(0, pos);
if (name.length() == 0) {
return;
}
pos++;

String val = buffer.substringTrimmed(pos, buffer.length());
if (HttpLog.LOGV) {
HttpLog.v("hdr " + buffer.length() + " " + buffer);

}


Das ist ein Package Logging, die Class HttpLog ist recht simple:

/**
* {@hide}
*/
class HttpLog {
private final static String LOGTAG = "http";

private static final boolean DEBUG = false;
static final boolean LOGV = DEBUG ? Config.LOGD : Config.LOGV;

static void v(String logMe) {
Log.v(LOGTAG, SystemClock.uptimeMillis() + " " + Thread.currentThread().getName() + " " + logMe);
}

static void e(String logMe) {
Log.e(LOGTAG, logMe);
}
}


Irgendwie verstehe ich nicht wie das bei dir einen Output geben sollte!

— geändert am 28.01.2011, 13:11:32

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

28.01.2011, 13:21:39 via Website

Bei mir soll garnichts rauskommen, sondern bei dir ;-)

Ich liefere dir nur Denkanstöße ... ob das in der Android Version auch funktioniert ... keine Ahnung ... aber einen Versuch wäre es MIR wert.


Ich hab mir mal den Quellcode von Commons Logging vorgenommen und der sieht so aus:

LogFactory:
1/**
2 * JDK1.3+ <a href="http://java.sun.com/j2se/1.3/docs/guide/jar/jar.html#Service%20Provider">
3 * 'Service Provider' specification</a>.
4 *
5 */
6 protected static final String SERVICE_ID =
7 "META-INF/services/org.apache.commons.logging.LogFactory";

D.h. das normale commons logging geht über die ServiceProvider um eine konkrete Logging-Implementierung zu finden, die es nutzen kann.
Der normale HTTPClient geht über commons logging, um zu loggen.

1+1 ergibt also, dass man dem normalen HTTPClient über ServiceProvider einen Logger unterjubeln kann :)

Auf das Android Pendant kann ich leider grad nicht schauen...aber soll ja auch nur ein Denkanstoß für DICH sein ;)

— geändert am 28.01.2011, 13:31:04

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

28.01.2011, 13:56:58 via Website

Schonmal auf den Code geschaut den Ich gezeigt habe? In einigen Klassen habe ich das so gesehen,
das HTTPClient ja ihre eigene Logging Facade nutzt für das nicht Android SDK hat google das an der stelle ausgebaut.
Momentan sieht es so aus als ob es garnicht geht, mir gehen da gerade die ideen aus.

Außer man biegt den HTTP Request auf einen Proxy um und "snifft" entsprechend mit, das schon mal jemand gemacht ? War das nicht irgendwie IP 10.0.0.1 ?

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

28.01.2011, 14:01:21 via Website

Mac Systems
Schonmal auf den Code geschaut den Ich gezeigt habe?
Jupp, aber die Klasse Log hast Du nicht zitiert. Die wird aber vom unteren CodeBlock verwendet.
Was darin passiert wäre doch interessant.

Mac Systems
Außer man biegt den HTTP Request auf einen Proxy um und "snifft" entsprechend mit, das schon mal jemand gemacht ? War das nicht irgendwie IP 10.0.0.1 ?
Wofür so kompliziert?
Im Emu laufen lassen und mit WireShark sniffen.


EDIT:
Eine Idee hab ich noch.
Wenn du eh den Quellcode hast, kopier dir die Klassen des HTTPClient in dein Package (zumindest, die die du einsehen willst), bieg die Verweise entsprechend um, dann kannst Du ihn sogar debuggen ;) ... oder halt Logging selbst einfügen.

— geändert am 28.01.2011, 14:29:02

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

28.01.2011, 14:59:47 via Website

Nö, wireshark tut es auch.

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten