首页 > 解决方案 > 构建一个处理程序以通过 SFTP 登录

问题描述

我正在尝试构建一个处理程序来通过 Sftp 对日志文件上的每个日志记录事件执行 put 操作。目前,我已经根据我的 Groovy 脚本构建了一个新的记录器,它使用 SftpConnector 工件的 ChannelSftp 来执行放置和附加到日志文件。当我运行我的代码时,我收到一条错误消息,指出它是 Invalid Type=105。如果我附加到一个字符串并在我的脚本结束时将字符串内容上传到我的日志文件,那么就没有问题了。我猜我收到的错误是由于快速分离中对同一文件的多次放置操作?

def LOG = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME)
def handler = new Handler() {

///String outputBuffer
@Override
void publish(LogRecord record) {
    ProgressMonitor monitor = new ProgressMonitor()
    String aRecord = new SimpleDateFormat("MMM dd, YYYY hh:mm:ss aaa").format(new Date()).toString() +  " " + record.level.toString() + ":" + " " + record.message.toString()
    def stream = IOUtils.toInputStream(aRecord,"UTF-8")
    connector.getChannelSftp().put(stream ,props.getProperty("sftp.log"),monitor,2)
    while(!monitor.isFinished()){
        //just pause until logging is done.
    }
    stream.close()
    //outputBuffer = outputBuffer + new SimpleDateFormat("MMM dd, YYYY hh:mm:ss aaa").format(new Date()).toString() +  " " + record.level.toString() + ":" + " " + record.message.toString() + "\n"
}

@Override
void flush() {

}

@Override
void close() throws SecurityException {

}

void push(){

connector.getChannelSftp().put(IOUtils.toInputStream(outputBuffer, "UTF-8"), 
props.getProperty("sftp.log"), 2)
    connector.getChannelSftp().put(IOUtils.toInputStream('\n'), 
 props.getProperty("sftp.log"),2)
}
}

//SftpHandler handler = new SftpHandler(props)
//def handler = new FileHandler(new 
File(props.getProperty("log.location")).absolutePath, true) //provides a writer for log file.
handler.setFormatter(new SimpleFormatter()) //defines the logger file 
format. must be declared
LOG.addHandler(handler) //adding the handler.

标签: groovy

解决方案


我解决了这个问题:

当尝试在打开的 ChannelSftp 上放置时,只要之前的放置操作完成,它就可以正常工作。如果在同一会话中同一通道上有多个 put,则服务器将执行并锁定文件。

解决这个问题的方法是打开一个新通道,执行 put,然后在自定义处理程序中关闭通道。每个 put 命令在不同的会话中执行,如果文件被锁定而不是简单地拒绝,则将排队。


推荐阅读