将输出发送到文件时出现 log4j2 问题
log4j2 problems when sending output to a file
我有以下 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>
然后在 main class 中输入:
private static final Logger logger = LogManager.getLogger(Main.class.getName());
并且在同一个 class 中,我使用以下行记录了多条消息:
logger.trace("Starting application...");
logger.info("This should be written to file, but doesn't");
当我调试我的应用程序时:
- 我所有的跟踪消息都写入控制台。
- 信息消息 (logger.info) 只写到控制台而不是
文件。文件已创建,但如果我打开它是空的。为什么?
我没有在执行应用程序时进行测试(没有调试)。请问是否正常,调试成功
大概您的 Main class 在 com.my.example 包或子包中。所以它正在使用该记录器进行记录。该记录器仅配置为转到控制台。它的可加性设置为 false,因此它不会委托给根记录器。如果是这样,根记录器将第二次记录到控制台,然后记录到文件。
根据您的配置,记录到文件的唯一方法是记录来自记录器的事件,而不是来自 com.my.example 包的记录器。例如,如果您执行
记录器 logger2 = LogManager.getLogger("Test");
logger2.info("This will be written to the file");
它实际上会转到文件。
请参阅 http://logging.apache.org/log4j/2.x/manual/architecture.html 讨论所有内容的地方。
我有以下 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>
然后在 main class 中输入:
private static final Logger logger = LogManager.getLogger(Main.class.getName());
并且在同一个 class 中,我使用以下行记录了多条消息:
logger.trace("Starting application...");
logger.info("This should be written to file, but doesn't");
当我调试我的应用程序时:
- 我所有的跟踪消息都写入控制台。
- 信息消息 (logger.info) 只写到控制台而不是 文件。文件已创建,但如果我打开它是空的。为什么?
我没有在执行应用程序时进行测试(没有调试)。请问是否正常,调试成功
大概您的 Main class 在 com.my.example 包或子包中。所以它正在使用该记录器进行记录。该记录器仅配置为转到控制台。它的可加性设置为 false,因此它不会委托给根记录器。如果是这样,根记录器将第二次记录到控制台,然后记录到文件。
根据您的配置,记录到文件的唯一方法是记录来自记录器的事件,而不是来自 com.my.example 包的记录器。例如,如果您执行
记录器 logger2 = LogManager.getLogger("Test"); logger2.info("This will be written to the file");
它实际上会转到文件。
请参阅 http://logging.apache.org/log4j/2.x/manual/architecture.html 讨论所有内容的地方。