JSch 登录文件
Posted
技术标签:
【中文标题】JSch 登录文件【英文标题】:JSch Logs in files 【发布时间】:2018-05-04 19:17:31 【问题描述】:我想将 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
【问题讨论】:
【参考方案1】:在MyLogger.log
中使用Logger.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);
);
【讨论】:
以上是关于JSch 登录文件的主要内容,如果未能解决你的问题,请参考以下文章