2014-10-15 3 views
0

Grails 2.2.4 애플리케이션에서 캐치되지 않는 예외가 발생할 경우 알려주고 싶습니다. Log4j는 SMTPAppender와 비슷한 기능을하지만 특정 로그 수준만을 기반으로합니다. 내 응용 프로그램에는 이미 사용 가능한 모든 로그 수준에 많은 로그 항목이 있으므로 ERROR 또는 FATAL에서 전자 메일을 보내는 것은 예외가 아닌 항목을 포함하기 때문에 실제로 옵션이 아닙니다. Grails의에서Grails의 사용자 정의 로그 레벨

필터링 캐치되지 않는 예외가 매우 쉽습니다, 그냥 특정 컨트롤러로 리디렉션 거기 그것을 처리 :

static mappings = { 
    [...] 
    "500"(controller: "errors", action: "serverError") 
} 

내 계획은 내 자신의 로그 레벨을 소개하고만을 캐치되지 않는 예외를 사용하는 것이 었습니다.

final Level EXCEPTION = Level.forName("EXCEPTION", 50); 
logger.log(EXCEPTION, "uncaught exception", e); 

하지만 주입 된 log 객체와 Grails는이를 사용하는 방법을 모르겠어요 문서는이 제안합니다. log.error('foo',e)과 같은 기본 옵션 만 지원합니다. Grails 문서는 커스텀 어 펜더를 추가하는 방법을 말하지만, 커스텀 레벨에 대해서는 전혀 설명하지 않습니다 (또는 놓쳤습니까?)

어떤 제안이 있습니까?

답변

2

Grails는 Slf4j와 Commons Logging을 사용하여 로거 구현을 추상화하고 로거로 모든 파일을 편집하지 않고도 Log4j에서 다른 프레임 워크로 변경할 수 있습니다. 대신 래퍼 라이브러리는 요청 된 로거 이름과 기본 API에서 사용할 수있는 것을 기반으로 올바른 구현 인스턴스를 가져옵니다. 구현을 변경하면 래퍼 로거는 앱 코드와 관련하여 동일한 방식으로 작동하지만 실제 로깅을 수행하는 다른 구현 로거를 호출합니다.

구성을위한 구현 간에는 표준이 없으므로 내부 Grails 시작 코드가 API와 직접 연동하여 로거, 어 펜더, 레벨 등을 구성 할 수 있습니다. 기존 Log4j 로거 액세스 코드를 사용하여 인스턴스를 얻을 수도 있습니다 사전 구성된 로거 Grails와 동일한 것을 사용하는 로거 이름별로. 나는 유물에서 로거에 대한 명명 규칙을 기억할 수 없다, 그래서 나는 속이 내가 실행을 알고하는 방법에 코드

println log.name 

의 라인을 추가하고, 거기에 얻을 수있는 어떤 컨트롤러 액션을 통해 간접적으로 메서드를 호출합니다. 예를 들어, FractalService의 로거를 알고 싶다면이 코드를 graphJuliaSet 메소드에 넣고이 서비스를 사용하여 Julia Sets를 그래프로 표시하는 컨트롤러 조치를 호출하십시오.

로거에 액세스하여 변경하면 향후 모든 통화에 영향을줍니다. Log4j 로거는 싱글 톤입니다.

String name = ... // the name from the println above 
Logger logger = Logger.getLogger(name) 
+0

감사 버트, 나는 내 수입을 엉망으로 일관 log4j를 사용하지 않았다고 생각 :

은 그래서 로거 같은 것을 통해 사용할 수 있습니다. 매력처럼 지금 일하고 있어요. – moeTi