2014-03-28 1 views
3

Catalyst 프로젝트의 경우 Catalyst 및 내 명령 줄 응용 프로그램과 호환되는 Moose 기반 예외 유형을 사용하고 있습니다.Catalyst에서 Plack :: Middleware 호환 예외를 사용할 때 로그 출력이 누락되었습니다.

클라이언트에게 오류 메시지가있는 Catalyst REST 인터페이스를 제공하기 위해 예외 클래스의 일부로 http 상태 코드를 제공하는 code 서브 루틴을 구현했습니다. 이 방법으로 Plack::MiddlewarePlack::Middleware::HTTPExceptions의 pod 설명서에 설명 된대로 사용하고 싶습니다.

모두 정상적으로 작동합니다. 예외가 반환되도록 클라이언트에 반환됩니다.

내 문제는 : 예외를 throw 할 때마다 미들웨어에 걸려 내 로그 (Log::Log4perl)가 손실되고 Catalyst의 웹 서버 perl 스크립트 출력에 흔적도 오류도 찾을 수 없습니다.

예외 클래스에 의해 캡슐화되지 않지만 희귀 한 문자열 (예 : die "BOOM!")이 출력 될 때마다 로그 출력이 기록되고 오류가 문서화됩니다 (분명히 오류는 Catalyst에 의해 캐치되어 재발행되지 않습니다) 던져).

미들웨어에 예외를 다시 던져야하지만 Catalyst에 로깅 요청을 유지하도록 어떻게 알 수 있습니까?

답변

0

이 질문에는 두 가지 부분이있는 것으로 보이지만이 부분이이 문제를 다루고 있다고 생각합니다. Log4perl을 설정하여 오류를 기록하는 것이 더 중요하지만 Catalyst 및 Plack 고려 사항이 있습니다.

log4perl.logger      = DEBUG, FileAppndr, Screen, DebugPanel 
log4perl.appender.FileAppndr   = Log::Log4perl::Appender::File 
log4perl.appender.FileAppndr.filename = log/server.log 
log4perl.appender.FileAppndr.autoflush = 1 
log4perl.appender.FileAppndr.stderr = 1 
log4perl.appender.FileAppndr.layout = PatternLayout 
log4perl.appender.FileAppndr.layout.ConversionPattern=%d [%p] - %m%n 

log4perl.appender.Screen    = Log::Log4perl::Appender::Screen 
log4perl.appender.Screen.stderr  = 1 
log4perl.appender.Screen.autoflush = 1 
log4perl.appender.Screen.layout  = PatternLayout 
log4perl.appender.Screen.layout.ConversionPattern=%d [%p] - %m%n 

1 거기에 stderr 값의 포함 :

먼저, 여기에 내가 가진 것이 일반적인 log4perl의 구성 설정 될 것입니다. 따라서 log4perl에 로깅을 위해 stderr을 캡처하도록 지시합니다.

Catalyst 측에서는 실제로 컨텍스트에 대한 사용자 정의 init 코드가 있지만 기본적으로 두 가지 설정이 있습니다.

  1. $c->log

  2. 로드 PSGI 미들웨어 Plack::Middleware::Log4perl 통해 본질적 Log::Log4perl::Catalyst하는 문맥 로거를 설정한다. 실제로 촉매 구성을로드 할 때 psgi_middleware 구성 키를 통해이 작업을 수행합니다. 그래서 "Plack :: Middleware"컨텍스트 경로에 모든 것이 이미 있기 때문에 "Log4perl"보다 설정 라인에 더 많은 것이 없습니다.

두 번째 부분이 것 "픽업"로드 "log4perl"예를 필요에 따라 어떤 PSGI 구성 요소는 다음 로거에 액세스 할 수 있도록하는 psgi.logger에 할당합니다.

그럼, 이와 같은 코드에서 "다시 던져"입니다 이후 문 :

my $e = HTTP::Exception->new(404); 
    $e->status_message("BOOM!!"); 
    $e->throw; 

실제로뿐만 아니라에서 "log4perl"출력에 어떤 원시 die 문을 집어 될 것입니다.

적어도 Catalyst 5.90060 이상의 경우입니다. HTTP :: Exception 타입 클래스에 관해서 추가되고 싶다면 여전히 좋은 점이 몇 가지있다.

+0

안녕하세요 닐, 어쨌든 그건 내 문제를 해결하지 못했습니다. Logger 컨텍스트 설정과 관련하여 설명서가 나오고 Catalyst 응용 프로그램이 이미 작동 한 것처럼 보이지만 psgi_middleware 구성의 Log4perl을 설정하면 추가 로깅이 생성되지 않습니다. 미들웨어 기능을 포함하지 않는 또 다른 해결 방법을 게시했지만 미들웨어 또는 촉매 옵션을 정의하여 문제를 해결하는 데 여전히 관심이 있습니다. –

+0

@deviolog 나는 "기여 문서"에 실제로 쓴 코드 이외의 "문서화"에 대해 확신하지 못합니다. 그래서 나는 그것이 실제로 옳다고 생각할 것입니다. –

0

Neil의 답변에 몇 가지 올바른 진술이 포함되어 있어도 Catalyst 응용 프로그램에 적용했지만 아무런 결과도 얻지 못했습니다. 나는 그 문제를 해결하기 위해 서브 클래스를 Catalyst::Engine으로 분류한다. 이 서브 클래스는 finalize_error만을 재정의하고 나머지 기능은 그대로 둡니다. 내 자신의 예외 유형을 찾는 경우 개별 응답 본문과 상태 코드를 설정하여 "사다리꼴"예외를 다시 던져서 동일한 결과를 얻습니다.

관련 문제