使用Java连接Shell输出日志

前言:自己的搭建了一个平台,为了方便查看日志,使用Java自研了一个查看日志的界面。我的做法是使用Java登录到服务器上,根据前端传入的路径,每次最多获取20条的数据,前端每个2s钟刷新一次接口,第一个会根据文件的当前行读取内容,后续会根据前端传入的行数顺序往后读取文件内容。

如下登录Shell的工具类

public class SessionUtil {

	private static final Logger infoLogger = LoggerFactory.getLogger("infoLogger");
	private Session session;

	@Value("${ssh.host}")
	private String sshHost;
	@Value("${ssh.user}")
	private String sshUser;
	@Value("${ssh.passwd}")
	private String sshPasswd;
	
	@PreDestroy
	public void cleanUp() {
		closeConnection();
	}
	public Session getSession() {
		if (session == null) {
			this.session = JschUtil.getSession(sshHost, 22, sshUser, sshPasswd);
		}
		return this.session;
	}
	private void closeConnection() {
		if (session != null) {
			try {
				this.session.disconnect();
				infoLogger.info("关闭Session连接");
				this.session = null;
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
}

如下是我的根据前端传入的文件的目录,获取文件的内容

// 列出当前的文件夹下的所有的文件夹
Session session = sessionUtil.getSession();
try {
	ChannelShell channel = (ChannelShell) session.openChannel("shell");
	channel.connect();
	//从远程端到达的所有数据都能从这个流中读取到
	InputStream inputStream = channel.getInputStream();
	//写入该流的所有数据都将发送到远程端。
	OutputStream outputStream = channel.getOutputStream();
	//使用PrintWriter流的目的就是为了使用println这个方法
	PrintWriter printWriter = new PrintWriter(outputStream);
	StringBuilder pathString = new StringBuilder("");
	if (StringUtils.isNotEmpty(source)) {
		String[] split = source.split("_");
		for (String s : split) {
			pathString.append("/").append(s);
		}
	} else {
		pathString.append("/data/logs/");
	}
	String cmd = "wc -l "+ pathString +" |awk '{print $1}'";
	infoLogger.info("cmd = {}",cmd);
	printWriter.println(cmd);
	printWriter.println("exit");//加上个就是为了,结束本次交互
	printWriter.flush();
	BufferedReader in = new BufferedReader(new InputStreamReader(inputStream));
	String msg = "";
	List<String> stringList = new ArrayList<String>();
	boolean isWrite = false;
	while ((msg = in.readLine()) != null) {
		if (isWrite && StringUtils.isNumeric(msg)) {
			stringList.add(msg);
		}
		if (msg.indexOf("wc -l") > 0) {
			isWrite = true;
		}
	}
	resultFile = stringList;
	in.close();
	channel.disconnect();
} catch (Exception e) {
	errorLogger.info(e.toString());
}

效果图
效果图

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值