2017-09-22 1 views
1

우리는 java-ee 응용 프로그램에서 Log4j2를 사용합니다. 로깅이 SLF4J에 대해 프로그래밍되는 라이브러리를 사용합니다. 이 라이브러리에는 원하지 않는 많은 것들을 기록하는 클래스가 있습니다 -> 그래서이 Logger의 LogLevel을 OFF로 설정하고 싶습니다.라이브러리의 slf4j가 내 log4j2 구성을 무시하는 것 같습니다

내 log4j2.xml은 다음과 같습니다

<?xml version="1.0" encoding="UTF-8"?> 
<Configuration status="trace" shutdownHook="disable"> 
    <Appenders> 
     <Console name="ConsoleAppender" target="SYSTEM_OUT" ignoreExceptions="false" > 
      <PatternLayout pattern="%d{ISO8601} %d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> 
     </Console> 
     <JDBC name="DatabaseAppender" tableName="logentry" ignoreExceptions="false" > 
      <ConnectionFactory class="xx.xx.xx.xx.LoggingConnectionFactory" method="getDatabaseConnection" /> 
      <Column name="eventDate" isEventTimestamp="true" /> 
      <Column name="level" pattern="%level" isUnicode="false"/> 
      <Column name="logger" pattern="%logger" isUnicode="false"/> 
      <Column name="message" pattern="%message" isUnicode="false"/> 
      <Column name="exception" pattern="%throwable{50}" isUnicode="false"/> 
     </JDBC> 
    </Appenders> 
    <Loggers> 
     <Logger name="net.rubyeye.xmemcached.transcoders.BaseSerializingTranscoder" level="off" additivity="false"> 
      <AppenderRef ref="ConsoleAppender"/> 
     </Logger> 
     <Root level="INFO"> 
      <AppenderRef ref="DatabaseAppender"/> 
      <AppenderRef ref="ConsoleAppender"/> 
     </Root> 
    </Loggers> 
</Configuration> 

그러나 BaseSerializingTranscoder은 여전히 ​​오류를 기록합니다. 간단한 테스트를 수행하고 BaseSerializingTranscoder에서 찾은 로그 코드를 테스트 함수에 배치하면 org.slf4j.Logger.LoggerFactory (라이브러리에서 수행되는 작업)에서 검색 한 로거가 logger1의

import net.rubyeye.xmemcached.transcoders.BaseSerializingTranscoder; 
import org.apache.logging.log4j.LogManager; 
import org.apache.logging.log4j.Logger; 
import org.slf4j.LoggerFactory; 

org.slf4j.Logger logger1 = LoggerFactory.getLogger(BaseSerializingTranscoder.class); 
logger1.error("log test the same way as in library"); 

Logger logger2 = LogManager.getLogger(BaseSerializingTranscoder.class); 
logger2.error("log test"); 

출력은 볼, 내가 제거하고 싶었 : (내 구성이 올바르게 적용됩니다) org.apache.logging.log4j.LogManager을 통해 로거를 검색 할 수 있습니다. 뭐가 잘못 되었 니?

편집
Wildfly 10.1을 사용합니다. 나는 똑같은 문제가있는 최소한의 예를 만들 수 있었다.

pom.xml :

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>test</groupId> 
    <artifactId>test</artifactId> 
    <version>1.0-SNAPSHOT</version> 

    <packaging>war</packaging> 

    <dependencies> 
     <dependency> 
      <groupId>org.jboss.spec</groupId> 
      <artifactId>jboss-javaee-all-7.0</artifactId> 
      <version>1.0.1.Final</version> 
     </dependency> 

     <dependency> 
      <groupId>org.slf4j</groupId> 
      <artifactId>slf4j-api</artifactId> 
      <version>1.7.25</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.logging.log4j</groupId> 
      <artifactId>log4j-slf4j-impl</artifactId> 
      <version>2.9.1</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.logging.log4j</groupId> 
      <artifactId>log4j-core</artifactId> 
      <version>2.9.1</version> 
     </dependency> 

    </dependencies> 

</project> 

log4j2.xml :

<?xml version="1.0" encoding="UTF-8"?> 
<Configuration status="warn"> 

    <Appenders> 
     <Console name="consoleAppender" target="SYSTEM_OUT"> 
      <PatternLayout pattern="%d %p %c [%t] %m%n" /> 
     </Console> 
    </Appenders> 

    <Loggers> 
     <Logger name="blah" level="off" additivity="false"> 
      <AppenderRef ref="consoleAppender" /> 
     </Logger> 
     <Root level="info"> 
      <AppenderRef ref="consoleAppender" /> 
     </Root> 
    </Loggers> 
</Configuration> 

Service.java :

import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 

import javax.annotation.PostConstruct; 
import javax.ejb.Singleton; 
import javax.ejb.Startup; 

@Singleton 
@Startup 
public class Service { 

    private static final Logger loggerBlah = LoggerFactory.getLogger("blah"); 

    private static final Logger logger = LoggerFactory.getLogger(Service.class); 

    @PostConstruct 
    private void startup() { 
     logger.info("test1"); 
     logger.error("test2"); 
     loggerBlah.info("test3"); 
     loggerBlah.error("test4"); 
    } 
} 

출력 :

21:13:11,641 INFO [Service] (ServerService Thread Pool -- 40) test1 
21:13:11,641 ERROR [Service] (ServerService Thread Pool -- 40) test2 
21:13:11,641 INFO [blah] (ServerService Thread Pool -- 40) test3 
21:13:11,641 ERROR [blah] (ServerService Thread Pool -- 40) test4 
,174,

test3 및 test4를 로깅해서는 안됩니다! 무엇이 잘못 되었나요?

+0

어떤 서블릿 API 버전을 사용하고 있는가? –

+0

지금 당신이 할 수있는 최선의 방법은 간단한 웹 애플리케이션을 만드는 것입니다 (아무것도 시작하지 말고 새 앱을 빌드하십시오). 그리고 문제를 재현 해보십시오. 다시 작성할 수 있으면 문제가있는 위치를 알 수 있습니다. 필자는 환경에 대한 세부 사항이나 코드 작성 및 실행 방법에 대한 세부 정보를 갖고 있지 않습니다. 일반적으로 stackoverflow에서 우리는 질문 작성자가 [최소, 완전하고 검증 가능한 예제] (http://stackoverflow.com/help/mcve)를 제공하므로 지금 작업해야한다고 생각합니다. –

+0

EJB를 사용하여 최소한의 예제를 만들고이를 Wildfly 10.1에 배포했습니다. -> 정확히 내 문제. 이 예제에서 모든 파일을 보여주는 질문을 업데이트했습니다. http://pubstore.webhop.org/misc/issues/java/logging1.zip – badera

답변

3

업데이트 # 2 : 업데이트 후

가 나는 문제를 복제 할 수 있었다. 저의 최근 코멘트에 따라 this answer을 사용하여 문제를 해결하는 데 도움이되었습니다.

나는 웹 프로젝트의 META-INF에 다음 JBoss에 배포-structure.xml 추가 : 나는 의심의 여지없이 확인 될 수 있도록 나는 또한 약간 log4j2.xml을 수정
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2"> 
    <deployment> 
     <exclusions> 
      <module name="org.apache.log4j" /> 
     </exclusions> 
     <exclude-subsystems> 
      <subsystem name="logging"/> 
     </exclude-subsystems> 
    </deployment> 
</jboss-deployment-structure> 

그 이 파일에 지정된 구성이 사용되었습니다. 나는 모든 메시지의 접두사로 문자열 "MY_PATTERN"를 추가 할 PatternLayout을 변경 :

<PatternLayout pattern="MY_PATTERN %d %p %c [%t] %m%n" />

출력 :

09:30:38,074 INFO [stdout] (ServerService Thread Pool -- 137) MY_PATTERN 2017-09-24 09:30:38,073 INFO example.Service [ServerService Thread Pool -- 137] test1 
09:30:38,077 INFO [stdout] (ServerService Thread Pool -- 137) MY_PATTERN 2017-09-24 09:30:38,077 ERROR example.Service [ServerService Thread Pool -- 137] test2 

메시지의 TEST3 및 테스트 4는 더 이상 콘솔에 기록됩니다.


PREVIOUS 응답 및 업데이트 :

나는 당신의 문제는 당신이 당신의 클래스 경로가 설정 한 방법과 관련이있다 생각한다. 종속성 계층 구조를 확인하여 필요한 모든 올바른 로깅 라이브러리가 있는지 확인하는 것이 좋습니다. 여기

package blah; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 


public class Main { 

    private static final Logger log = LoggerFactory.getLogger(Main.class); 

    public static void main(String[] args) { 

     log.trace("trace log"); 
     log.debug("debug log"); 
     log.info("info log"); 
     log.warn("warn log"); 
     log.error("error log"); 
    } 

} 

가 log4j2.xml 구성이다 : 여기서

가 SLF4J 및 log4j2으로 OFF 레벨로의 간단한 예이다

<dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>slf4j-api</artifactId> 
    <version>1.7.25</version> 
</dependency> 
<dependency> 
    <groupId>org.apache.logging.log4j</groupId> 
    <artifactId>log4j-slf4j-impl</artifactId> 
    <version>2.9.1</version> 
</dependency> 
<dependency> 
    <groupId>org.apache.logging.log4j</groupId> 
    <artifactId>log4j-core</artifactId> 
    <version>2.9.1</version> 
</dependency> 
: 여기

<?xml version="1.0" encoding="UTF-8"?> 
<Configuration status="warn"> 

    <Appenders> 
     <Console name="consoleAppender" target="SYSTEM_OUT"> 
      <PatternLayout pattern="%d %p %c [%t] %m%n" /> 
     </Console> 
    </Appenders> 

    <Loggers> 
     <Logger name="blah" level="off" additivity="false"> 
      <AppenderRef ref="consoleAppender" /> 
     </Logger> 
     <Root level="info"> 
      <AppenderRef ref="consoleAppender" /> 
     </Root> 
    </Loggers> 
</Configuration> 

하면 의존성이다

"ㅋㅋ"로거 수준을 해제로 설정하면 콘솔에 로그가 전혀 표시되지 않습니다. 내가 추적과 같은 것으로 그것을 바꿀 때 나는 모든 로그를 본다.

UPDATE :

내가 서블릿 API 3.1.0을 사용하여 함께 간단한 웹 응용 프로그램을 넣을 수 있었고 작업 로깅 (나는 ERROR 레벨 메시지를 볼 OFF로 레벨을 설정하지 수 있어요)을 얻었다 위의 예에서 언급 한 종속성. 그래서 그것은 확실히 어떤 종류의 구성 문제로 보일 것입니다. 참고로 나는 단순한 앱을 Tomcat 8에 배치했다.

+0

'pom. xml 파일; 그러나 행동은 여전히 ​​동일합니다. Log4J2.xml에 정의 된'blah' logger는'blah' 패키지에 있기 때문에'LoggerFactory.getLogger (Main.class)'logger의 동작에도 영향을 미칩니 까? – badera

+0

POM 파일에 대한 자세한 내용을 제공하기 위해 질문을 업데이트하십시오. log4j 또는 slf4j와 관련된 모든 것이 도움이 될 수 있습니다. 구성에 관해서는 예 로거가 그 호출로 얻은 로거는 로거가 계층 적이기 때문에 - 그것은 어쩌구를 찾지 못하기 때문에 어쩌면 로거입니다. 만약 그것이 찾지 못한다면 루트를 사용할 것입니다. –

+0

감사합니다. D.B. 당신의 놀라운 도움을 !! – badera

관련 문제