2013-04-30 2 views
4

Ruby의 새로운 기능 저는 지금 다른 루비 파일에서 여러 테스트 스크립트를 실행하는 간단한 드라이버 스크립트가 있습니다. RunScript()라는 테스트 스크립트를 실행하는 메서드가 있습니다. 로거는 드라이버 스크립트에서 전역 변수로 만들어져 다른 파일의 테스트 스크립트에서 사용할 수 있습니다. 로거는 디렉토리의 로그 파일에 로그합니다.메서드 내에서 로거 출력 캡처

Runscript() 메서드가 실행되는 동안 발생하는 로깅 출력을 캡처하여 String으로 저장할 수 있기를 원합니다. 그래서 기본적으로 각 테스트 스크립트에 대한 로그 출력 문자열을 원하고 모든 출력을 저장하는 로그 파일을 보관합니다.

답변

5

나는 여러 가지 방법으로 이런 짓을했습니다, 그리고 내가 발견 한 가장 편리한이 위임 객체를 구축하는 것입니다 두 개 이상의 로거 경로 메시지 :

require 'stringio' 
require 'logger' 

class LoggerTee 

    def initialize *loggers 
    @loggers = loggers 
    end 

    def method_missing meth, *args, &block 
    @loggers.each { |logger| logger.send(meth, *args, &block) } 
    end 

end 

capture_stringio = StringIO.new 
console_log = Logger.new(STDOUT) 
string_log = Logger.new(capture_stringio) 
log = LoggerTee.new(console_log, string_log) 

log.debug 'Hello world' 
puts capture_stringio.string 

출력 :

D, [2013-04-30T18:59:18.026285 #14533] DEBUG -- : Hello world 
D, [2013-04-30T18:59:18.026344 #14533] DEBUG -- : Hello world 

이 예제에서 LoggerTee 클래스는 두 개의 개별 로거로 인스턴스화됩니다. 하나는 콘솔로 이동하고 다른 하나는 StringIO 인스턴스로 이동합니다. 결과적으로 생성 된 LoggerTee 인스턴스는 표준 로거 객체를 대체합니다.

+0

약간의 수정을 거친 후 로그가 출력됩니다. – sng

+0

같은 문제가있는 다른 사람들을 위해 나는 run 메소드 시작 부분에 @@ capture_stringio.truncate (@@ capturestringio.rewind)를 추가하여 다음 스크립트의 로그 내용을 지울 수 있도록했습니다. – sng

1

실제로 추가 작업을 가져 오지 않고도 로거의 내용을 가져올 방법이 없습니다. 여기에 다른 해결책이 있습니다. 로거는 여러 로깅 방법을 가지고 있기 때문에 단순히 자신하고 로그인

#the_logger - regular logger 
    #the_arr - a global array to keep your logs in 
    #the_string - log string 

    def log_info(the_logger, the_arr, the_string) 

     the_logger.info(the_string); 
     the_arr.push(the_string); 
    end 
    .....................and use global the_arr to get your output 

은 '디버그', '정보', '치명적인'에 대해이 작업을 수행하는 기능에 로그를 수집 할 수 있습니다이 사용하는 간단한 방법입니다