2014-11-09 20 views
6

Come posso configurare il livello del logger JSch?Registratore JSch - dove posso configurare il livello

È simile a Log4J configurabile tramite XML?

+0

grazie per la menzione – Alexey

+0

@Alexey Se trovi una risposta utile, ti preghiamo di accettarla (controllo bianco nell'angolo in alto a sinistra di questa risposta). Indica ad altri utenti che ha veramente risposto alla domanda e che possono fidarsi. – xav

risposta

11

JSch non sembra utilizzare alcun framework di registrazione noto (utilizzo JSch v0.1.49, ma l'ultima versione è v0.1.51) o qualsiasi file di configurazione XML. Così qui è quello che ho fatto:

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... 
    } 
} 

Quindi prima di utilizzare JSch:

JSch.setLogger(new JSCHLogger()); 

Nota che invece di MyLevel e MyLogger, è possibile utilizzare tutte le classi quadro di registrazione che si desidera (Log4j, Logback,. ..)

È possibile ottenere un esempio completo qui: http://www.jcraft.com/jsch/examples/Logger.java.html

+1

Grazie per la risposta, che è utile - ma il fatto che dobbiamo implementare la nostra classe di registrazione per ottenere informazioni da JSch è INSANE. Se Spring può permetterci di accedere tramite log4j o altro, perché non Jcraft? – SteveT

+0

@SteveT lol sì è triste ... Guardando il codice sorgente sembra che non amano gli standard Java, quindi i framework tradizionali come SLF4J o Log4j potrebbero non sembrare interessanti per loro ... – xav

6

volevo solo aggiungere un piccolo commento alla risposta accettata, ma la reputazione non consente. Scusa se in questo modo tramite un'altra risposta è male, ma in realtà voglio menzionare il seguente.

L'attivazione del registro funziona in questo modo e consente di ottenere molte informazioni sulla procedura di connessione (scambio di chiavi e così via). Ma non c'è praticamente nulla come l'output di debug per le funzionalità di base dopo l'autenticazione, almeno per SFTP. E uno sguardo alla sorgente mostra/conferma che non vi è alcuna registrazione in ChannelSftp (e nella maggior parte delle altre classi).

Quindi, se si desidera attivare questo al fine di ispezionare i problemi di comunicazione (dopo l'autenticazione) che è sprecato - o è necessario aggiungere dichiarazioni appropriate alla fonte da soli (non ho ancora).

Incontriamo blocchi completi (i thread di lavoro rimangono bloccati per giorni/infinito) in put, get e persino ls - e ovviamente il provider del server afferma di non essere il problema (e infatti funziona unix sftp commandline-client - ma non dall'host dell'appserver, a cui non abbiamo accesso .. quindi dovremmo controllare le comunicazioni di rete). Se qualcuno ha un'idea, grazie ..

+0

Si è rivelato un dispatcher tra noi e il server era responsabile. Tuttavia, non è certo positivo che non ci siano assolutamente timeout in jsch, con il risultato che i thread si bloccano per sempre in casi del genere (non posso dirti cosa è successo esattamente a livello di rete, ma probabilmente semplicemente non ci sono più pacchetti nella connessione) – hyphan