2017-11-21 8 views
3

Ich möchte JSch Logs in Datei speichern, weil es nichts in der Konsole zeigt.JSch Loggt Dateien

Dies ist mein Code:

public boolean openConnection() throws ItsSshException { 
    boolean connectSuccess = false; 

    JSch.setLogger(new MyLogger()); 

    Properties config = new Properties(); 
    config.put("StrictHostKeyChecking", "no"); 
    jschSSH.setConfig(config); 
    try { 
     sshSession = jschSSH.getSession(username, hostname, port); 
     sshSession.setPassword(password); 
     sshSession.connect(connectionTimeout); 
     LOGGER.info("Connection timeout : " + connectionTimeout); 
     Thread.sleep(1000); 
     sshHChannel = sshSession.openChannel("shell"); 
     sshHChannel.connect(); 
     in = sshHChannel.getInputStream(); 
     out = new PrintStream(sshHChannel.getOutputStream()); 
     clearInitialSocketState(); 
     connectSuccess = true; 
    } catch (Exception e) { 
     LOGGER.error("Error during connectiong to host: " + hostname + 
        ", port: " + port + "!", e); 
     throw new ItsSshException("Error during connectiong to host: " + e.getMessage()); 
    } 
    LOGGER.info("connectSuccess : " + connectSuccess); 
    return connectSuccess; 
} 

public static class MyLogger implements com.jcraft.jsch.Logger { 
    static java.util.Hashtable name=new java.util.Hashtable(); 
    static{ 
     name.put(new Integer(DEBUG), "DEBUG: "); 
     name.put(new Integer(INFO), "INFO: "); 
     name.put(new Integer(WARN), "WARN: "); 
     name.put(new Integer(ERROR), "ERROR: "); 
     name.put(new Integer(FATAL), "FATAL: "); 
    } 
    public boolean isEnabled(int level){ 
     return true; 
    } 
    public void log(int level, String message){ 
     System.err.print(name.get(new Integer(level))); 
     System.err.println(message); 
    } 
} 

Wo die jsch Logger setzen einige Informationen in der Datei zu erhalten. Ich habe versucht, aber nie successed: D

Antwort

2

Verwendung Logger.log im MyLogger.log:

public void log(int level, String message){ 
    LOGGER.log(loggerlevel, message); 
} 

Eine vollständige Code kann wie sein:

static private class MyJSchLogger implements com.jcraft.jsch.Logger { 
    private java.util.logging.Logger logger; 

    public MyJSchLogger(java.util.logging.Logger logger) { 
     this.logger = logger; 
    } 

    public boolean isEnabled(int level){ 
     return true; 
    } 
    public void log(int level, String message){ 
     java.util.logging.Level l; 
     switch (level) 
     { 
     case com.jcraft.jsch.Logger.DEBUG: 
      l = java.util.logging.Level.FINE; 
      break; 
     case com.jcraft.jsch.Logger.INFO: 
      l = java.util.logging.Level.INFO; 
      break; 
     case com.jcraft.jsch.Logger.WARN: 
      l = java.util.logging.Level.WARNING; 
      break; 
     default: 
     case com.jcraft.jsch.Logger.ERROR: 
     case com.jcraft.jsch.Logger.FATAL: 
      l = java.util.logging.Level.SEVERE; 
      break; 
     } 
     this.logger.log(l, message); 
    } 
} 

Um den Logger mit JSch Verwendung gefunden:

JSch.setLogger(new MyJSchLogger(logger)); 

Angenommen, Java logger existiert.

Wenn nicht, können Sie erstellen ein wie:

java.util.logging.Logger logger = java.util.logging.Logger.getLogger("MyJSch"); 
java.util.logging.FileHandler fh = new java.util.logging.FileHandler("C:\\path\\jsch.log"); 
java.util.logging.SimpleFormatter formatter = new java.util.logging.SimpleFormatter(); 
fh.setFormatter(formatter); 
logger.addHandler(fh); 

Obwohl, wenn Sie nur in einer Datei müssen sich einloggen, können Sie es direkt tun:

JSch.setLogger(new com.jcraft.jsch.Logger() { 
    Path path = Paths.get("C:\\path\\jsch.log"); 
    @Override 
    public boolean isEnabled(int level){ 
     return true; 
    } 
    public void log(int level, String message){ 
     try { 
      StandardOpenOption option = 
       !Files.exists(path) ? StandardOpenOption.CREATE : StandardOpenOption.APPEND; 
      Files.write(path, java.util.Arrays.asList(message), option); 
     } catch (IOException e) { 
      System.err.println(message); 
     } 
    } 
});