2012-05-14 4 views
3

Мне нравится выполнять команду и копировать ее stdout и stderr в файл журнала.Как вы делаете молодую тройку?

Мне нравится работать:

p = myexecute("ls -l /tmp/") 

И по существу имеют тот же объект процесса возвращается как:

p = "ls -l /tmp/".execute() 

С той разницей, что STDOUT/STDERR копируется в указанный лог-файл. Я уверен, что есть простой способ сделать это в хорошем состоянии, но я недостаточно разбираюсь, чтобы это увидеть.

ответ

0

Вы правы, это просто:

logFile.withWriter('UTF-8') { sout -> 
    p = "ls -l /tmp/".execute() 
    p.consumeProcessOutput(sout, sout) 
} 

Это будет записывать оба потока в тот же файл.

Дополнительные примеры см http://groovy.codehaus.org/Process+Management

+0

Ах, это круто! Но не то, что я хочу, извините, если я не понял в своем вопросе. Мне нравится «слушать» в потоках и копировать их в файл, не потребляя их, что немного напоминает команду unix [tee] (http://en.wikipedia.org/wiki/Tee_ (команда)). – Spotty

+1

Это просто: Внесите свой собственный 'FilterWriter' и заверните' sout' с ним. –

1

Лучшее решение может быть:

def logFile = new File('/tmp/log.txt') 
logFile.withWriter('UTF-8') { sout -> 
    p = "ls -l /tmp/".execute() 
    p.waitForProcessOutput(sout, sout) 
} 

Как это будет ждать завершения процесса

+0

Конечно, это в дополнение к чему-то вроде [TeeOutputStream] (http://commons.apache.org/io/apidocs/org/apache/commons/io/output/TeeOutputStream.html) из apache commons может быть более полным решение, которое вы, вероятно, после ... –

1

Этот ответ давно, но одно решение может be:

import groovy.ui.SystemOutputInterceptor 

File logFile = new File('stdout.log')                     
new SystemOutputInterceptor({logFile << it; true}).start() 
... 
Смежные вопросы