Jakarta ee 库中的slf4j似乎忽略了我的log4j2配置
我们在JavaEE应用程序中使用Log4j2。我们使用一个库,其中日志是根据SLF4J编程的。在这个库中有一个类,它记录了很多我不想要的东西->所以我想把这个记录器的LogLevel设置为OFF 我的log4j2.xml如下所示:Jakarta ee 库中的slf4j似乎忽略了我的log4j2配置,jakarta-ee,slf4j,log4j2,Jakarta Ee,Slf4j,Log4j2,我们在JavaEE应用程序中使用Log4j2。我们使用一个库,其中日志是根据SLF4J编程的。在这个库中有一个类,它记录了很多我不想要的东西->所以我想把这个记录器的LogLevel设置为OFF 我的log4j2.xml如下所示: <?xml version="1.0" encoding="UTF-8"?> <Configuration status="trace" shutdownHook="disable"> <Appenders>
<?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>
logger1的输出是可见的,我想消除它。怎么了
编辑我们使用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>
输出:
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!
怎么了?更新#2:
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
在你的更新之后,我能够复制这个问题。根据我最近的评论,我能够用它来指导我解决这个问题
我在web项目的META-INF中添加了以下jboss-deployment-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>
消息test3和test4不再记录到控制台
以前的答案和更新:
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
我怀疑您的问题与如何配置类路径有关。我强烈建议您检查依赖关系层次结构,以确保拥有所需的所有正确日志库
下面是一个使用SLF4J和log4j2的关闭电平的简单示例:
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>
org.slf4j
slf4j api
1.7.25
org.apache.logging.log4j
log4j-slf4j-impl
2.9.1
org.apache.logging.log4j
log4j型芯
2.9.1
当我将“blah”记录器的级别设置为off时,我在控制台上根本看不到日志。当我把它改成trace时,我会看到所有的日志
更新:
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
我能够使用ServletAPI3.1.0组装一个简单的web应用程序,并使用上面示例中提到的依赖关系使日志记录工作正常(我能够将级别设置为OFF,并且看不到错误级别的消息)。因此,这显然是某种配置问题。仅供参考,我将我的简单应用程序部署到Tomcat8上 更新#2:
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
在你的更新之后,我能够复制这个问题。根据我最近的评论,我能够用它来指导我解决这个问题
我在web项目的META-INF中添加了以下jboss-deployment-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>
消息test3和test4不再记录到控制台
以前的答案和更新:
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
我怀疑您的问题与如何配置类路径有关。我强烈建议您检查依赖关系层次结构,以确保拥有所需的所有正确日志库
下面是一个使用SLF4J和log4j2的关闭电平的简单示例:
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>
org.slf4j
slf4j api
1.7.25
org.apache.logging.log4j
log4j-slf4j-impl
2.9.1
org.apache.logging.log4j
log4j型芯
2.9.1
当我将“blah”记录器的级别设置为off时,我在控制台上根本看不到日志。当我把它改成trace时,我会看到所有的日志
更新:
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
我能够使用ServletAPI3.1.0组装一个简单的web应用程序,并使用上面示例中提到的依赖关系使日志记录工作正常(我能够将级别设置为OFF,并且看不到错误级别的消息)。因此,这显然是某种配置问题。仅供参考,我将我的简单应用程序部署到Tomcat8上 我调整了我的
pom.xml
文件;然而,这种行为仍然是一样的。为了正确理解您:log4j2.xml中定义的blah
logger也会影响LoggerFactory.getLogger(Main.class)
logger的行为,就因为它在packageblah
?请更新您的问题,以提供有关POM文件的更多详细信息-任何与log4j或slf4j相关的信息都会有所帮助。关于配置yes,通过该调用获得的记录器是blah logger,因为记录器是分层的-它没有找到blah.Main,所以它查找blah。如果它没有找到布拉,它将使用根。非常感谢你,D.B.为你的惊人帮助!!我调整了我的pom.xml
文件;然而,这种行为仍然是一样的。为了正确理解您:log4j2.xml中定义的blah
logger也会影响LoggerFactory.getLogger(Main.class)
logger的行为,就因为它在packageblah
?请更新您的问题,以提供有关POM文件的更多详细信息-任何与log4j或slf4j相关的信息都会有所帮助。关于配置yes,通过该调用获得的记录器是blah logger,因为记录器是分层的-它没有找到blah.Main,所以它查找blah。如果它没有找到布拉,它将使用根。非常感谢你,D.B.为你的惊人帮助!!您正在使用哪个版本的ServletAPI?我认为您现在可以做的最好的事情是创建一个简单的web应用程序(从无到有,构建一个新的应用程序),并尝试重新创建您的问题。如果你能重新创建它,你就会知道问题出在哪里。我没有您的环境的所有细节,也没有您如何构建和运行代码的细节。一般来说,关于stackoverflow,我们会问作者提供的问题,所以我认为这就是您现在需要解决的问题。我用EJB制作了一个简单的示例,并将其部署到Wildfly 10.1。->正是我的问题。我更新了显示此示例中所有文件的问题。这里我提供下载:您注意到输出的模式与patt不匹配吗