将输出发送到文件时出现log4j2问题

时间:2016-02-10 10:20:18

标签: log4j log4j2

我在log4j2.xml文件下面:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Properties>
        <Property name="LOG_DIR">.</Property>
        <Property name="ARCHIVE">output.log</Property>
        <Property name="CONSOLE_PATTERN">[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n</Property>
        <Property name="FILE_PATTERN">%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n</Property>
    </Properties>
    <Appenders>
        <Console name="console" target="SYSTEM_OUT">
            <PatternLayout pattern="${CONSOLE_PATTERN}"/>
        </Console>
        <File name="file" fileName="${LOG_DIR}/${ARCHIVE}" immediateFlush="false" append="false">
            <PatternLayout pattern="${FILE_PATTERN}"/>
        </File>
    </Appenders>
    <Loggers>
        <Root level="info" additivity="false">
            <AppenderRef ref="console"/>
            <AppenderRef ref="file"/>
        </Root>
        <Logger name="com.my.example" level="TRACE" additivity="false">
            <AppenderRef ref="console"/>
        </Logger>
    </Loggers>
</Configuration>

然后在主要课程中我把:

private static final Logger logger = LogManager.getLogger(Main.class.getName());

在同一个类中,我使用以下行记录了几条消息:

    logger.trace("Starting application...");
    logger.info("This should be written to file, but doesn't");

当我调试我的应用时:

  • 我的所有跟踪消息都写入控制台。
  • 信息消息(logger.info)仅写入控制台但不写入 文件。文件已创建但如果我打开则为空。为什么?

我在执行应用程序时没有测试过(没有调试)。我想知道这是否正常,只是调试成功。

1 个答案:

答案 0 :(得分:1)

据推测,您的Main类位于com.my.example包或子包中。所以它正在使用该记录器进行记录。该记录器仅配置为进入控制台。它的可加性设置为false,因此它不会委托给根记录器。如果是,那么根记录器将第二次登录到控制台,然后登录到该文件。

使用您的配置,记录该文件的唯一方法是记录来自com.my.example包之外的记录器的事件。例如,如果你这样做

Logger logger2 = LogManager.getLogger(“Test”); logger2.info(“这将写入文件”);

它实际上会转到该文件。

请参阅http://logging.apache.org/log4j/2.x/manual/architecture.html所有讨论的内容。