我正在尝试构建一个处理程序,以通过Sftp对日志文件上的每个日志记录事件执行放置操作。当前,我已经在Groovy脚本中构建了一个新的记录器,该脚本使用SftpConnector工件的ChannelSftp进行放置和追加到日志文件。当我运行代码时,我收到一条错误消息,提示它是无效的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.
答案 0 :(得分:0)
我发现了问题:
当尝试在打开的ChannelSftp上进行推入时,只要先前的推入操作已完成,它就可以正常工作。如果在同一会话的同一通道上有多个put,则服务器将执行并锁定文件。
解决此问题的方法是在自定义处理程序内部打开一个新通道,执行放置操作,然后关闭该通道。每个put命令都是在不同的会话上执行的,如果文件被锁定而不是简单地被拒绝,它将被排队。