EDIT: Я неправильно понял ваш вопрос. Поскольку вы просили более простого решения, но я попытался предоставить решение для комплексного подхода. В любом случае, я надеюсь, что это будет полезно.
Actual Ответ:
я сделал следующую деятельность для моего проекта
- очистить журналы, используя скрипт на удаленном сервере UNIX
- Выполните передний конец деятельности
- журналы захвата после того, как предопределенное время (скажем, 60 секунд)
- SFtp обратно на клиентскую машину
Сначала вам понадобится клиент SFTP и клиент SSH для взаимодействия с сервером unix. здесь Узел - это объект, содержащий данные Unix env. поэтому измените соответственно. Использование JSch Библиотека для этого
public static String runCommand(String Command, Node node)
{
String output = null;
if (node.getConnType().equals("SSH")){
int exitStatus = 0;
try{
JSch jsch=new JSch();
JSch.setConfig("StrictHostKeyChecking", "no");
Session session=jsch.getSession(node.getUserName(), node.getHost(), 22);
session.setPassword(node.getPassword());
session.setConfig("PreferredAuthentications",
"publickey,keyboard-interactive,password");
session.connect();
String command=Command;
Channel channel=session.openChannel("exec");
((ChannelExec)channel).setCommand(command);
channel.setInputStream(null);
((ChannelExec)channel).setErrStream(System.err);
InputStream in=channel.getInputStream();
channel.connect();
byte[] tmp=new byte[1024];
while(true){
while(in.available()>0){
int i=in.read(tmp, 0, 1024);
if(i<0)break;
output = new String(tmp, 0, i);
}
if(channel.isClosed()){
if(in.available()>0) continue;
exitStatus= channel.getExitStatus();
//System.out.println("exit-status: "+exitStatus);
break;
}
try{Thread.sleep(1000);}catch(Exception ee){}
}
channel.disconnect();
session.disconnect();
}
catch(Exception e){
e.printStackTrace();
}
if (exitStatus == 0)
{
if(output != null)
return output.replaceAll("[\\n\\r]", "");
}
}
return null;
}
SFTP клиент
public boolean transferFileSFTP(Node node,String srcDir,String targetDir,String srcFileName,String targetFileName, String direction)
{
JSch jsch = new JSch();
Session session = null;
try {
session = jsch.getSession(node.getUserName(), node.getHost(), 22);
session.setConfig("StrictHostKeyChecking", "no");
session.setConfig("PreferredAuthentications",
"publickey,keyboard-interactive,password");
session.setPassword(node.getPassword());
session.connect();
Channel channel = session.openChannel("sftp");
channel.connect();
ChannelSftp sftpChannel = (ChannelSftp) channel;
System.out.println("src:" + srcDir+srcFileName);
System.out.println("target:" + targetDir+targetFileName);
sftpChannel.get(targetDir+targetFileName, srcDir+srcFileName);
sftpChannel.exit();
session.disconnect();
return true;
} catch (JSchException e) {
e.printStackTrace();
} catch (SftpException e) {
e.printStackTrace();
}
return false;
}
Теперь дождаться нужного времени и сделать его резьба на основе собирать журналы одновременно из различных приложений участвуют, с использованием Исполнитель-сервис и Будущее < Строка > Утилиты
Созданный таким образом один класс LogCollector, который инициирует запрос, а другой - ThreadClass (логический), который будет выполнять действия в файле журнала.
LogCollector.java
public class LogCollector {
private static ExecutorService pool = Executors.newFixedThreadPool(100);
private static List<Future<String>> list = new ArrayList<Future<String>>();
public static void add(Node node, String srcDir, String targetDir, String srcFileName, String targetFileName, long wait)
{
list.add(pool.submit(new LogCollectorThread(System.currentTimeMillis()/1000,wait, srcDir, targetDir, srcFileName, targetFileName, node)));
}
public static void getResult()
{
try{
for (Future<String> future : list) {
String out =future.get();
//DO whatever you want to do with a response string return from your thread class
}
pool.shutdown();
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
LogCollectorThread.java
public class LogCollectorThread implements Callable<String>{
long startTime;
long wait;
String srcFileName;
String targetFileName;
String srcDir;
String targetDir;
Node node;
public LogCollectorThread(long startTime, long wait,String srcDir, String targetDir,String srcFileName, String targetFileName,
Node node) {
super();
this.startTime = startTime;
this.wait = wait;
this.srcFileName = srcFileName;
this.targetFileName = targetFileName;
this.srcDir = srcDir;
this.targetDir = targetDir;
this.node = node;
}
/***
* Returns a String with Parameters separated by ',' and status at the end
* status values:
* 0 - successfully retrieved log file
* 1 - failure while retrieving log file
*/
@Override
public String call() throws Exception {
while((System.currentTimeMillis()/1000 - startTime)<=wait)
{
Thread.sleep(1000);
}
MyFTPClient sftp= new MyFTPClient();
boolean result =sftp.transferFileSFTP(this.node, this.srcDir, this.targetDir, this.srcFileName, this.targetFileName, "From");
System.out.println(this.node.getHost() + ","+ this.srcDir + ","+this.targetDir +","+ this.srcFileName +","+ this.targetFileName);
if(result == true)
return this.node.getHost() + ","+ this.srcDir + ","+this.targetDir +","+ this.srcFileName +","+ this.targetFileName +"," + "0" ;
else
return this.node.getHost() + ","+ this.srcDir + ","+this.targetDir +","+ this.srcFileName +","+ this.targetFileName +"," + "1" ;
}
}
Как использовать LogCollector классы:
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(Calendar.getInstance().getTime());
Helper.runCommand("cd /opt/redknee/app/crm/current/log/; echo > AppCrm.log", testEnv.getBSS());
LogCollector.add(testEnv.getBSS(), "collectedLogs\\", "/opt/redknee/app/crm/current/log/", timeStamp + "_" + testEnv.getBSS().getHost() + "_BSS_AppCrm.log" , "AppCrm.log", 60);
//So your thread is working now, so now perform your Front End Activity
//After 60 seconds, log file will be SFTPed to client host
//You can perform you activity before adding logCollectorThread or just before that
LogCollector.getResult();
Здесь я дал слишком много кода, Но слишком сложно описать каждый шаг по строчке. Главное, что я хотел доказать, это использование java. Большинство вещей возможны. Вам решать, насколько это важно, и стоит ли этого делать.
Теперь подходит к вашему точному требованию поиска определенной строки.
Как вы можете видеть в logCollectorThread, , в настоящее время я ничего не делаю, а жду только 60 секунд. Так здесь вы можете использовать RunCommand для Grep нужной строки из журналов вы можете использовать команду как
grep -i "Action Completed" | grep -v 'grep' | wc -l
, если он возвращает 1, вы нашли свою строку Аналогично вы можете проверить на сообщения о неудаче. и вернуть желаемую строку из вашего потока и получить ее как результат в методе threadCollector.getResult().
И как только файл передается FTP вашему клиенту, разбор его для конкретной строки с использованием Java будет очень простым. StackOverflow поможет вам в этом :)
declaimer: не ожидайте, что код будет полностью работать. Он будет работать, но вы должны приложить свои усилия. ваши знания java понадобятся для подключения отсутствующих частей.
Селен не очень хорошо подходит для этого. Используете ли вы тестовую среду (JUnit/TestNG) для выполнения тестов? Если это так, вы можете использовать любой Java-способ для реализации этого. – Magnilex
Да, я использую JUnit для выполнения тестов. Однако с java я все еще сталкиваюсь с теми же проблемами, что и проверять журналы, которые мне нужны для ssh, на серверы, запускать проверки журналов и отправлять результаты на мою машину. Есть ли способ лучше? –
Завершение действия можно найти, указав изменение элемента при переходе на новую страницу, или мы можем сохранить глобальную переменную, которая может быть установлена как истина/ложь при выполнении транзакций (например, в пользовательском интерфейсе Echo - EchoServerTransaction.active = "true /ложный"). – Nagappan