2012-06-21 5 views
15

저는 로깅 프레임 워크로 SLF4j를 사용했으며, log4j가 지원합니다. 내 문제는 런타임에 내 로거의 로깅 수준을 변경하는 방법을 찾고 있다는 것입니다.런타임시 slf4j 레벨을 변경하는 방법은 무엇입니까?

slf4j는 자체 API를 통해이를 직접 허용하지 않으므로 로깅 공급자에 직접 액세스해야한다는 것을 알고 있습니다. 개인적으로, 나는 이것을 slf4j에서 엄청난 결핍이라고 생각한다. 그래서 지금 내 질문은 slf4j를 통해 프로그래밍 방식으로 어떤 공급자를 사용하고 있는지 어떻게 결정할 수 있는가? slf4j를 사용하는 가장 큰 목적은 당신이 공급자와 상관없이 될 수 있다는 것입니다. 여러분은 어떤 코드도 다시 코딩 할 필요없이 원하는 로깅 시스템을 쉽게 전환 할 수 있습니다. 하지만 이제 log4j를 직접 호출해야한다면 그 능력을 잃어 가고 있습니다.

적어도 Log4j를 제공자로 사용하고 있는지 확인하고 싶다면 로그 레벨을 전환 할 수 있도록 허용하고 싶습니다.

만약 내가 LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME)이라면 결과는 org.slf4j.impl.Log4jLoggerAdapter이고 심지어는 org.apache.log4j.Logger이 아닙니다. (기대했던대로).

이 정보를 찾을 방법이 있습니까?

덕분에, 에릭

+1

참조 : [slf4j 라이브러리는 어떻게 찾을 수 있습니까?] (http://stackoverflow.com/questions/10505418) –

+0

감사합니다. 나는 왜 내가 원래의 수색에서 그것을 놓쳤는 지 잘 모르겠다. –

답변

13

SLF4J는 라이브러리,되지 않는 응용 프로그램 (물론, 당신은 여전히 ​​일관성을 위해, 자신의 애플리케이션의 로깅 호출에서 SLF4J을 사용해야 할 수 있습니다)에 대한 추상화으로 설계되었습니다. 자신의 앱에서 기본 로거 프레임 워크를 선택하므로 로깅 설정 관련 부분의 log4j API에 액세스해도됩니다.

라이브러리가 로깅 설정 IMHO를 변경하는 것과 관련해서는 안됩니다. 따라서 SLF4J API에있는 것이 적절하지 않습니다.

+3

SLF4J가 전적으로 라이브러리에 사용되는 경우 충분합니다. 그러나 라이브러리에서 매우 융통성있는 어떤 것도 응용 프로그램에서 사용할 수 있어야합니다. 모든 로깅 프레임 워크를 연결할 수있는 단일 API를 갖는 개념은 환상적입니다. 또한 응용 프로그램의 일부가 아닌 부분이 라이브러리로 리팩토링되는 경우가 있습니다. slf4j가되기 위해 log4j에 대한 참조를 다시 코딩해야하는 것은 의미가 없습니다. SL4j가 라이브러리 (slf4j 사이트에서 읽지 않은 라이브러리) 용으로 만 설계된 것이라면 나는 근시안적인 것을 발견했습니다. –

+3

죄송 합니다만, 확실하지 않습니다. 앱의 로깅 호출에 SLF4J를 사용해야합니다. 그러나 로깅 설정을 변경하는 코드의 작은 부분에서 Log4J 클래스에 항목을 캐스트하십시오. 로깅 구현을 전환하기로 결정했다면, 어쨌든 그 비트를 다시 작성해야합니다. – artbristol

+0

동의. 총체적으로 모든 일을하려했습니다. 나는 단지 실현 가능하지 않다고 생각한다. 그것은 캐스팅의 문제조차 아니에요 - Log4j 클래스를 직접 사용하여 호출해야합니다 (예 : 로거를 검색하기 위해 slf4j.LoggerFactory 대신 log4j.Logger 사용) –

관련 문제