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?
Welche Version von Servlet API verwenden Sie? –
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. –
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