2013-01-18 9 views
6

Ho questo codice per i file di log remoti di coda:coda con grep file di log remoti

def do_tail(session, file) 
     session.open_channel do |channel| 
     channel.on_data do |ch, data| 
     puts "[#{file}] -> #{data}" 
     end 
     channel.exec "tail -f #{file}" 
    end 

    Net::SSH.start("host", "user", :password => "passwd") do |session| 
     do_tail session, "/path_to_log/file.log" 
     session.loop 

voglio recuperare solo le righe con "ERROR" stringa in file.log, sto cercando di chiamare "coda -f # {file} | grep ERROR "ma senza successo.

Grazie in anticipo.

+2

Qual è l'output di 'tail -f # {file} | grep ERRORE'? – Hugo

+3

Puoi provare ad aggiungere '--line-buffered' al comando grep. – Cyrus

+0

Forse dovresti provare qualcosa come "bash -c 'tail -f # {file} | grep ERROR'" – user3132194

risposta

0

Non sono sicuro di voler eseguire tail -f #{file} | grep ERROR all'interno di un .loop. Il flag -f indica allo tail di mantenere i dati in streaming e non si esce mai da quel flusso con Ctrl + C.

Si consiglia di utilizzare semplicemente un semplice comando Bash per questo, per il quale non è nemmeno necessario il metodo .exec. Prova qualcosa come segue:

def do_tail session, file 
    @keyword = 'ERROR' 
    session.open_channel do |channel| 
    channel.on_data {|ch, data| puts "[#{file}] -> #{data}"} 
    `grep #{keyword} #{file}` 
    end 
end