2014-11-09 4 views
6

Wie kann ich den Level von JSch Logger konfigurieren?JSch Logger - wo kann ich den Level konfigurieren

Ist es wie Log4J über XML konfigurierbar?

+0

Dank für die Erwähnung – Alexey

+0

@Alexey Wenn Sie eine Antwort nützlich finden, bitte nehmen Sie es (weiß kariert in der oberen linken Ecke dieser Antwort). Es wird anderen Benutzern anzeigen, dass es die Frage wirklich beantwortet hat und dass es ihnen vertrauen kann. – xav

Antwort

11

JSch scheint kein bekanntes Logging-Framework zu verwenden (ich verwende JSch v0.1.49, aber die letzte Version ist v0.1.51) oder irgendeine XML-Konfigurationsdatei. Also hier ist das, was ich getan habe:

private class JSCHLogger implements com.jcraft.jsch.Logger { 
    private Map<Integer, MyLevel> levels = new HashMap<Integer, MyLevel>(); 

    private final MyLogger LOGGER; 


    public JSCHLogger() { 
     // Mapping between JSch levels and our own levels 
     levels.put(DEBUG, MyLevel.FINE); 
     levels.put(INFO, MyLevel.INFO); 
     levels.put(WARN, MyLevel.WARNING); 
     levels.put(ERROR, MyLevel.SEVERE); 
     levels.put(FATAL, MyLevel.SEVERE); 

     LOGGER = MyLogger.getLogger(...); // Anything you want here, depending on your logging framework 
    } 

    @Override 
    public boolean isEnabled(int pLevel) { 
     return true; // here, all levels enabled 
    } 

    @Override 
    public void log(int pLevel, String pMessage) { 
     MyLevel level = levels.get(pLevel); 
     if (level == null) { 
      level = MyLevel.SEVERE; 
     } 
     LOGGER.log(level, pMessage); // logging-framework dependent... 
    } 
} 

Dann vor JSch mit:

JSch.setLogger(new JSCHLogger()); 

Beachten Sie, dass anstelle von MyLevel und MyLogger, Sie Logging-Framework-Klassen verwenden, können Sie wollen (Log4j, Logback. ..)

Sie können hier ein komplettes Beispiel erhalten: http://www.jcraft.com/jsch/examples/Logger.java.html

+1

Danke für die Antwort, die hilfreich ist - aber die Tatsache, dass wir unsere eigene Protokollierungsklasse implementieren müssen, um Informationen aus JSch herauszuholen, ist INSANE. Wenn Spring uns log4j oder was auch immer erlauben kann, warum nicht Jcraft? – SteveT

+0

@SteveT lol ja, es ist traurig ... auf den Quellcode der Suche es sie wie Java-Standards nicht wirklich scheint, so traditionelle Frameworks wie SLF4J oder Log4j könnte ihnen nicht interessant aussehen ... – xav

6

einfach hinzufügen wollte ein kleiner Kommentar zu der angenommenen Antwort, aber Ruf nicht erlaubt. Sorry, wenn dieser Weg über eine andere Antwort böse ist, möchte aber folgendes wirklich erwähnen.

Die Log-Aktivierung arbeitet auf diese Weise, und es kann Ihnen eine Menge Informationen über den Verbindungsprozess (Schlüsselaustausch und so weiter) bekommen. Aber nach der Authentifizierung gibt es für die Kernfunktionalität praktisch keine Debug-Ausgabe, zumindest nicht für SFTP. Und ein Blick auf die Quelle zeigt/bestätigt, dass ChannelSftp (und die meisten anderen Klassen) nicht angemeldet sind.

Wenn Sie dies aktivieren möchten, um Kommunikationsprobleme zu untersuchen (nach der Authentifizierung), ist das verschwendet - oder Sie müssen der Quelle selbst entsprechende Anweisungen hinzufügen (ich noch nicht).

Wir stoßen auf vollständige hängen (Job-Threads bleiben für Tage/unendlich stecken) in Put, Get und sogar ls - und natürlich behauptet der Server-Provider, nicht das Problem zu sein (und in der Tat der Unix sftp Kommandozeilen-Client - aber nicht vom Appserver-Host, auf den wir keinen Zugriff haben ... also müssten wir die Netzwerkkommunikation überprüfen). Wenn jemand eine Idee, Dank hat ..

+0

einen Dispatcher zwischen uns stellte sich heraus, und der Server war verantwortlich. Allerdings ist es sicher nicht gut, dass es absolut keine Timeouts in jsch - in Fäden resultierenden hängen immer in solchen Fällen, dass (man kann nicht sagen, was genau auf der Netzebene passiert ist, aber wahrscheinlich einfach keine Pakete mehr in der Verbindung) – hyphan

Verwandte Themen