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”所建议的,所有信息级别的日志应该同时指向文件和控制台。