Создание обработчика для входа через SFTP - PullRequest
0 голосов
/ 12 февраля 2019

Я пытаюсь создать обработчик для выполнения операции put с каждым событием регистрации в файле журнала через Sftp.В настоящее время я построил новый логгер в строке моего скрипта Groovy, который использует ChannelSftp артефакта SftpConnector для выполнения размещения и добавления в файл журнала.Когда я запускаю свой код, я получаю сообщение об ошибке, в котором говорится, что это неверный тип = 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.

1 Ответ

0 голосов
/ 15 февраля 2019

Я выяснил проблему:

При попытке положить на открытый канал ChannelSftp он работает нормально, пока предыдущая операция размещения завершена.Если в одном и том же сеансе имеется несколько путов на один и тот же сеанс, сервер выполнит и заблокирует файл.

Чтобы обойти это, нужно открыть новый канал, выполнить пут и закрыть канал послевнутри пользовательского обработчика.Каждая команда put выполняется в течение другого сеанса и будет поставлена ​​в очередь, если файл заблокирован, а не просто отклонен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...