Java log4j2配置日志记录到文件,但不记录到控制台
我的Java log4j2配置日志记录到文件,但不记录到控制台,java,logging,log4j2,Java,Logging,Log4j2,我的log4j2版本是2.8 我在src/main/resources中有以下log4j2.xml: <?xml version="1.0" encoding="UTF-8"?> <Configuration status="WARN" monitorInterval="120"> <Appenders> <Console name="STDOUT" target="SYSTEM_OUT"> <
log4j2
版本是2.8
我在src/main/resources
中有以下log4j2.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" monitorInterval="120">
<Appenders>
<Console name="STDOUT" target="SYSTEM_OUT">
<PatternLayout>
<Pattern>%d{yyyy-MM-dd HH.mm.ss} %5p %c{1}:%L - %m%n</Pattern>
</PatternLayout>
</Console>
<RollingRandomAccessFile name="RollingRandomAccessFile" fileName="${env:CATALINA_HOME:-.}/logs/applicationlogs.log"
filePattern="${env:CATALINA_HOME:-.}/logs/$${date:yyyy-MM}/applicationlogs-%d{yyyy-MM-dd}-%i.log.gz">
<PatternLayout>
<Pattern>%d{yyyy-MM-dd HH.mm.ss} %5p %c{1}:%L - %m%n</Pattern>
</PatternLayout>
<Policies>
<OnStartupTriggeringPolicy />
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="50 MB"/>
</Policies>
</RollingRandomAccessFile>
</Appenders>
<Loggers>
<AsyncLogger name="com.mypackage" level="trace" includeLocation="true" additivity="false">
<AppenderRef ref="RollingRandomAccessFile"/>
</AsyncLogger>
<AsyncLogger name="org.springframework.jdbc" level="debug" includeLocation="true" additivity="false">
<AppenderRef ref="RollingRandomAccessFile"/>
</AsyncLogger>
<Root level="info" includeLocation="true">
<AppenderRef ref="STDOUT"/>
<AppenderRef ref="RollingRandomAccessFile"/>
</Root>
</Loggers>
</Configuration>
%d{yyyy-MM-dd HH.MM.ss}%5p%c{1}:%L-%m%n
%d{yyyy-MM-dd HH.MM.ss}%5p%c{1}:%L-%m%n
这会正确地记录到该文件,但控制台上不会显示任何内容
这里怎么了?是因为
一旦事件到达记录器且其可加性设置为false,则
事件将不会传递给其任何父记录器,无论
它们的可加性设置
所以日志事件只是没有传递到根级别。
要登录到控制台,请添加
<AsyncLogger name="com.mypackage" level="info" includeLocation="true" additivity="false">
<AppenderRef ref="STDOUT"/>
</AsyncLogger>
根据上面的回答,我这样做了:
<AsyncLogger name="com.mypackage" level="trace" includeLocation="true" additivity="false">
<AppenderRef ref="RollingRandomAccessFile"/>
</AsyncLogger>
<AsyncLogger name="org.springframework.jdbc" level="debug" includeLocation="true" additivity="false">
<AppenderRef ref="RollingRandomAccessFile"/>
</AsyncLogger>
<AsyncLogger name="com.mypackage" level="info" includeLocation="true" additivity="false">
<AppenderRef ref="STDOUT"/>
</AsyncLogger>
<AsyncLogger name="org.springframework.jdbc" level="info" includeLocation="true" additivity="false">
<AppenderRef ref="STDOUT"/>
</AsyncLogger>
但现在,这些日志只出现在控制台上。日志文件仍然为空
因此,我的最终解决方案是:
<AsyncLogger name="com.mypackage" level="trace" includeLocation="true" additivity="false">
<AppenderRef ref="RollingRandomAccessFile"/>
</AsyncLogger>
<AsyncLogger name="org.springframework.jdbc" level="debug" includeLocation="true" additivity="false">
<AppenderRef ref="RollingRandomAccessFile"/>
</AsyncLogger>
<AsyncLogger name="com.mypackage" level="info" includeLocation="true" additivity="false">
<AppenderRef ref="STDOUT"/>
<AppenderRef ref="RollingRandomAccessFile"/>
</AsyncLogger>
<AsyncLogger name="org.springframework.jdbc" level="info" includeLocation="true" additivity="false">
<AppenderRef ref="STDOUT"/>
<AppenderRef ref="RollingRandomAccessFile"/>
</AsyncLogger>
这正如预期的那样工作。但在这种情况下,所有跟踪和调试级别日志也将打印在控制台上。我不想那样。所有的初次登场和跟踪应该只指向文件,但正如“Root”所建议的,所有信息级别的日志应该同时指向文件和控制台。