groovy - 构建一个处理程序以通过 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.
解决方案
我解决了这个问题:
当尝试在打开的 ChannelSftp 上放置时,只要之前的放置操作完成,它就可以正常工作。如果在同一会话中同一通道上有多个 put,则服务器将执行并锁定文件。
解决这个问题的方法是打开一个新通道,执行 put,然后在自定义处理程序中关闭通道。每个 put 命令在不同的会话中执行,如果文件被锁定而不是简单地拒绝,则将排队。
推荐阅读
- javascript - javascript使对象逐渐移动而不是立即移动
- ruby - ruby 中的模型和模式是否相同?
- .net - IBM MQ .NET (amqmdnetstd) 共享订阅查询
- elasticsearch - 无法在弹性搜索中对聚合桶结果进行排序
- python-3.x - Python3.8 pytube ImportError:无法从“pytube”(未知位置)导入名称“YouTube”
- nginx-ingress - 使用 NGINX 入口控制器处理错误的请求错误
- python-3.x - 如何根据批次和时期的数量改变 Tensorflow 中的学习率?
- javascript - 在 Angular 的 next 中调用 .subcribe 中的 api
- javascript - 将输入添加到数组中并创建总和
- android - 通过单击按钮将应用内评论 API 实现到 android 应用中