java - JSch 登录文件

标签 java logging ssh jsch

我想将 JSch 日志保存在文件中,因为它不会在控制台中显示任何内容。

这是我的代码:

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);
    }
}

将 jsch 记录器放在哪里以获取文件中的一些信息。我试过但从未成功:D

最佳答案

使用Logger.logMyLogger.log 中:

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

一个完整的代码可以是这样的:

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);
    }
}

要将记录器与 JSch 相关联,请使用:

JSch.setLogger(new MyJSchLogger(logger));

假设 Java logger 存在。

如果没有,您可以像这样创建一个:

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);

虽然如果你只需要登录到一个文件,你可以直接这样做:

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);
        }
    }
});

关于java - JSch 登录文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47411185/

相关文章:

java - 来自 xml 文件的 vsdx (visio) 类图生成器,Java

java - 附加实体是否需要在 JPA 中合并?

Java:使用 HashMap 从 ArrayList 迭代 JMenuItem

ssh - 我可以在本地使用 RSA key 测试身份验证吗?

amazon-web-services - AWS : SSH to EC2 with Elastic Beanstalk Command Line Interface (EB CLI) 3. x

java - 从直线嵌套抛物线

java - Log4j 2 根记录器覆盖一切?

java - 使用 log4j2 的 Apache tomcat 8.5 访问日志

python - Django - 突然登录到(runserver)控制台

bash - 确定远程机器上的空闲线程数