2017-09-22 1 views
1

Wir verwenden Log4j2 in unserer Java-ee-Anwendung. Wir verwenden eine Bibliothek, in der die Protokollierung gegen SLF4J programmiert ist. In dieser Bibliothek ist eine Klasse, die viele Dinge protokolliert, die ich nicht will -> also möchte ich LogLevel dieses Loggers auf OFF setzen.slf4j in der Bibliothek scheint meine log4j2-Konfiguration zu ignorieren

Mein log4j2.xml sieht wie folgt aus:

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

Aber BaseSerializingTranscoder noch protokolliert Fehler. Wenn ich einen einfachen Test mache und den in BaseSerializingTranscoder gefundenen Protokollcode zu einer Testfunktion bringe, sehe ich, dass der Logger, der über org.slf4j.Logger.LoggerFactory (was von der Bibliothek gemacht wird) abgerufen wird, nicht dieselbe Konfiguration wie I hat abrufen des Loggers über org.apache.logging.log4j.LogManager (wo meine Konfiguration korrekt angewendet wird):

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"); 

der Ausgang des logger1 ist sichtbar, was ich beseitigen wollte. Was ist falsch?

Bearbeiten
Wir verwenden Wildfly 10.1. Ich konnte ein minimales Beispiel erstellen, das genau das gleiche Problem hat.

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"); 
    } 
} 

output:

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 und test4 sollten nicht protokolliert werden! Was ist los?

+0

Welche Version von Servlet API verwenden Sie? –

+0

Ich denke, das Beste, was Sie jetzt tun können, ist eine einfache Webanwendung zu erstellen (von nichts anfangen, eine neue App erstellen) und versuchen, Ihr Problem neu zu erstellen. Wenn Sie es neu erstellen können, werden Sie wissen, wo das Problem liegt. Ich habe nicht alle Details Ihrer Umgebung oder die Details, wie Sie den Code erstellen und ausführen. Bei stackoverflow bitten wir die Fragesteller, ein [minimales, vollständiges und verifizierbares Beispiel] (http://stackoverflow.com/help/mcve) zu erstellen, also denke ich, dass Sie jetzt daran arbeiten müssen. –

+0

Ich habe ein minimales Beispiel mit einem EJB gemacht und es zu Wildfly 10.1 eingesetzt. -> Genau mein Problem. Ich habe die Frage aktualisiert, die alle Dateien dieses Beispiels zeigt. Hier stelle ich es zum Download bereit: http://pubstore.webhop.org/misc/issues/java/logging1.zip – badera

Antwort

3

UPDATE # 2:

Nach Ihrem Updates konnte ich das Problem duplizieren. Laut meinem letzten Kommentar konnte ich this answer verwenden, um mich bei der Behebung des Problems zu unterstützen.

Ich habe die folgende jboss-Deployment-structure.xml zum META-INF des Webprojektes:

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

ich die log4j2.xml auch so leicht modifiziert, dass ich ohne jeden Zweifel sicher wäre, dass Die von dieser Datei angegebene Konfiguration wurde verwendet. Ich habe die PatternLayout die Zeichenfolge "MY_PATTERN" als Präfix für jede Nachricht hinzuzufügen:

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

Ausgang:

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 

Die Nachrichten test3 und test4 sind nicht mehr angemeldet zu trösten.


vorherige Antwort und Update:

Ich vermute, Ihr Problem hat damit zu tun, wie Sie Ihren Classpath konfiguriert. Ich empfehle dringend, dass Sie Ihre Abhängigkeitshierarchie überprüfen, um sicherzustellen, dass Sie alle richtigen Protokollbibliotheken haben, die Sie benötigen.

Hier ist ein einfaches Beispiel für den AUS-Pegel mit SLF4J und log4j2 mit:

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"); 
    } 

} 

Hier ist die log4j2.xml Konfiguration:

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

Hier sind die Abhängigkeiten:

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

Wenn ich die Ebene der "blah" Logger auf Aus eingestellt habe, sehe ich keine Protokolle auf der Konsole überhaupt. Wenn ich es in etwas wie eine Spur ändere, sehe ich alle Protokolle.

UPDATE:

ich in der Lage war, zusammen zu stellen eine einfache Web-Anwendung mit Servlet-API 3.1.0 und bekam die Protokollierung arbeiten (ich bin in der Lage Ebene auf OFF gestellt und nicht ERROR Level-Nachrichten sehen) mit die Abhängigkeiten, die ich im obigen Beispiel erwähnt habe. Es scheint also ein Konfigurationsproblem zu sein. Nur als ein FYI habe ich meine einfache App zu Tomcat 8 eingesetzt.

+0

Ich passte meinen 'Pom an. XML-Datei; Das Verhalten ist jedoch immer noch das gleiche. Nur um Sie richtig zu verstehen: Ihr definierter 'blah' Logger in log4j2.xml beeinflusst auch das Verhalten Ihres' LoggerFactory.getLogger (Main.class) 'Loggers, nur weil er im Paket' blah' ist? – badera

+0

Können Sie bitte Ihre Frage aktualisieren, um mehr Details über Ihre POM-Datei zu erhalten - alles, was mit log4j oder slf4j zusammenhängt, wäre hilfreich. In Bezug auf die Konfiguration ist der Logger, der durch diesen Aufruf erhalten wurde, der Blah-Logger, weil Logger hierarchisch sind - er findet kein blah.Main, also sucht er nach blah. Wenn es nicht blah fand, würde es root verwenden. –

+0

Vielen Dank, D.B. für deine erstaunliche Hilfe !! – badera

Verwandte Themen