由于项目部署在公司内网中,并且内网对外远程连接做了限制无法远程到服务器的情况下,开发人员抓取日志就比较麻烦了,每次都要找运维人员,就想着通过FTP服务器自主抓取日志提供下载,首先对创建FTP服务,我用的是FileZilla Server Interface,这个其它地方可以找到教程,添加ftp指向tomcat目录logs,action方法中提供日志名称,当然也可以循环取ftp目录下面所有文件,还有ip(服务器ip地址),ftp的用户名密码。实现层代码如下:
public class SystemlogServiceImp implements SystemlogService{
private Logger log = LoggerFactory.getLogger(this.getClass());
int port=21;
@Transactional(noRollbackFor=Exception.class)
public void uploadLog(Map<String, String> params,HttpServletResponse response) {
System.out.println("ftp下载接口");
FTPClient ftp = new FTPClient();
String fileName=params.get("fileName");
String ip=params.get("ip");
String username=params.get("username");
String password=params.get("password");
InputStream ins = null;
ServletOutputStream os=null;
BufferedOutputStream bos=null;
System.out.println("ip:"+ip+"---用户名:"+username+"---密码:"+password);
try {
ftp.connect(ip,port);
System.out.println("ftp连接成功");
ftp.login(username,password);
System.out.println("ftp登陆");
int replyCode = ftp.getReplyCode();
System.out.println("replyCode:"+replyCode);
if (!FTPReply.isPositiveCompletion(replyCode)) {
ftp.disconnect();
throw new RuntimeException("FTP连接失败");
}
System.out.print("ftp登陆成功");
ins=ftp.retrieveFileStream(fileName);
os= response.getOutputStream();
bos= new BufferedOutputStream(os);
response.setHeader("Content-Disposition","attachment; filename=\""+ fileName + "\"");
byte[]len= new byte[1024*2];
int read= 0;
while((read=ins.read(len)) != -1){
bos.write(len, 0, read);
System.out.println("read---"+read);
}
ftp.completePendingCommand();
bos.flush();
bos.close();
ins.close();
ftp.logout();
}
catch(Exception ex){throw new RuntimeException("FTP文件上传时出现错误", ex);
}
}
在过程中遇到一个问题抓取过去时间的日志正常,当日的日志信息出现0kb的情况,我考虑是不是代码有问题,在ftp测试手动拷贝的情况下,文件也是为空的,我猜测可能是文件还在占被用的问题,拷贝才会出现为空的情况,暂未找到解决方法,暂时记录一下。