2017-09-22 2 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 

test3とtest4は記録しないでください! どうしたのですか?

+0

使用しているサーブレットAPIのバージョンはどれですか? –

+0

私はあなたが今できることは、単純なWebアプリケーションを作成して(何から始める、新しいアプリケーションを作成する)、あなたの問題を再現しようとすることだと思います。あなたがそれを作り直すことができるなら、あなたはどこに問題があるか知るでしょう。私はあなたの環境の詳細や、コードをどのように構築して実行しているかについて詳しくは分かりません。一般的にstackoverflowでは、質問者が[最小、完全、および検証可能な例](http://stackoverflow.com/help/mcve)を提供するようにお願いします。 –

+0

私はEJBを使って最小限のサンプルを作成し、それをWildfly 10.1にデプロイしました。 - >まさに私の問題。この例のすべてのファイルを表示する質問を更新しました。ここで私はそれをダウンロードのために提供しています:http://pubstore.webhop.org/misc/issues/java/logging1.zip – badera

答えて

3

UPDATE#2:あなたのアップデート後

は私が問題を再現することができました。私の最新のコメントによれば、私はthis answerを使用して問題の修正を案内しました。

私は、WebプロジェクトのMETA-INFに次のjboss-展開するstructure.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> 

を私は疑いなく確かになるように私も少しlog4j2.xmlを修正このファイルで指定された構成が使用されていました。私はすべてのメッセージの接頭辞として文字列 "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およびTEST4はもはやコンソールに記録されているが。


前の回答と更新:

私はあなたの問題は、あなたのクラスパスが設定されているどのように関係している疑いがあります。依存関係階層をチェックして、必要なすべての適切なログライブラリがあることを確認することを強くお勧めします。ここ

はSLF4Jとlog4j2とOFFレベルを使用して簡単な例である:ここ

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構成である:ここ

<?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> 

は依存性である:

<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> 

私が "blah" loggerのレベルをoffに設定しても、コンソールにログが全く表示されません。私がトレースのようなものに変更すると、すべてのログが表示されます。

UPDATE:

私は、サーブレットAPI 3.1.0を使用して一緒に簡単なWebアプリケーションを入れることができたとロギングが働いてしまった(私がOFFにレベルを設定することができるよとERRORレベルのメッセージが表示されない)と上記の例で述べた依存関係。だから確かに何らかの構成上の問題であるように思えます。参考までに、私は単純なアプリをTomcat 8にデプロイしました。

+0

私は ' xmlファイル;しかし、その動作は同じです。 log4j2.xmlで定義された 'blah'ロガーは、' loggerFactory.getLogger(Main.class) 'ロガーの振る舞いに影響を与えます。単に' blah'パッケージ内にあるからです。 – badera

+0

あなたのPOMファイルの詳細を提供するためにあなたの質問を更新してください.log4jまたはslf4j関連のものは参考になります。設定に関しては、その呼び出しによって得られたロガーは、ロガーが階層的であるため、ロガーのロガーです。もしそれが見つからなければ、ルートを使用します。 –

+0

ありがとう、D.B.あなたの素晴らしい助けのために! – badera

関連する問題