2008-10-22 7 views
16

데몬 gem을 사용하여 Ruby에서 데몬을 만드는 중입니다. 데몬의 출력을 로그 파일에 추가하려고합니다. puts을 콘솔에서 로그 파일로 리디렉션하는 가장 쉬운 방법은 무엇입니까?"puts"명령 출력을 로그 파일로 리디렉션

+0

사용이'LOGGER || = Logger.new ("| 티 # {settings.root} /log/migration_script_logger.log", "월")'이 모두 할 것입니다 – vs4vijay

답변

13

내가, 그것을 박았보다 더 루비 로거를 사용할 것을 권장합니다, 당신은 당신이에/해제 할 수있는 여러 로그 수준을 가질 수 있습니다 : 디버그, 경고, 정보, 오류 등

logger = Logger.new(STDOUT) 
logger = Logger.new("/var/log/my-daemon.log") 

나는 runit 패키지를 사용하여 루비 서비스를 관리한다. 그것은 svlogd를 가지고있다. 로거 프로세스에 대한 로그 파일을하는 데몬 출력, 여기에서 실행되는 스크립트를 리디렉션 :

#!/bin/sh 
set -e 

LOG=/var/log/my-daemon 

test -d "$LOG" || mkdir -p -m2750 "$LOG" && chown nobody:adm "$LOG" 
exec chpst -unobody svlogd -tt "$LOG" 
+14

이것은 실제로 질문에 대답하지 않습니다. _puts_를하고있는 사람을 제어 할 수없고 STDOUT에 일반적으로 쓰고 대신 파일에 쓰는 것을 포착하고 싶다면 어떻게해야할까요? – silvamerica

11

은 복원하려면

$stdout = File.new('/tmp/output', 'w') 

을 시도해보십시오

$stdout = STDOUT 
+2

'$ stdout.sync = true'가 없으면 저에게 효과가 없을 것입니다. –

34

당신이 모두 STDERR 및 STDOUT을 캡처해야 및 로깅에 의존하지 않으려면, this post에서 적응 간단한 솔루션입니다 :

$stdout.reopen("my.log", "w") 
$stdout.sync = true 
$stderr.reopen($stdout) 
+0

고마워, [this] (http://stackoverflow.com/questions/1993071/how-to-controller-start-kill-a-background-process-server-app-in-ruby)와 관련하여 강력한 벌금을 부렸다. ! – TheDeadSerious

+0

'.sync'는 매우 중요합니다. –

+2

만약 puts가 여전히 터미널로 가고 파일을 로깅하기를 원한다면? 예 : 'ruby myscript.rb | 티 my.log' – wim

0

아니면 puts 명령을 다시 정의 할 수 있습니다? 단 하나의 파일/클래스에서 아마 작동

def puts(message) 
    #write message to file 
end 
관련 문제