是否有可能加速 log4j 或 slf4j 输出(也可能全局关闭它们)?

Is it possible to speed up log4j or slf4j outputs (and maybe also switch them off globally)?

我之前使用 System.out.println 在 Netbeans 中查看我的 java 控制台应用程序的输出。

程序 花了大约 10 分钟 到 运行 并在 运行ning 时显示输出。

现在我已经用 slf4j's logger

替换了所有 System.out.println's
private final Logger logger = LoggerFactory.getLogger(MyClass.class);    
logger.info("number of rows of x: " + numberOfx);

现在程序 需要 28 分钟 到 运行 并显示输出(没有进行其他更改)。

我没有在 pom 文件或其他地方做任何额外的配置。我刚刚将 slf4j-api:1.7.1slf4j-simple:1.7.18 的本地 jar 添加到 Netbeans 项目中并添加了导入

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

因为我只做了这么多,并且因为输出以红色显示在 Netbeans 控制台上,所以我假设输出没有被写入磁盘。

如果是,两个问题:
1. 是否已知 log4jslf4j 输出比 System.out.println 慢?
2. 有什么办法可以加快输出速度吗? (可能是因为一些可以禁用的内部检查,所以速度很慢?)
3. 我需要我的程序 运行 快。有没有办法全局关闭日志记录,而不是转到每个文件并注释掉 logger.info() 语句?

如果您不想避免构建日志消息的成本(String 实例化),请在日志级别和利用级别(即 infowarn 等)上使用条件日志记录适当地。 假设您在日志记录配置文件中将日志记录级别提高到 warnerror,正确使用 logger 将是:

if(logger.isInfoEnabled()){ logger.info("some message {}",var); }

这应该会加快整体代码执行速度,并且是性能优化代码的首选方法。

其次,除非您有非常具体的同步日志记录要求,否则请使用 AsyncAppender。这将进一步提高性能。参见 https://logging.apache.org/log4j/2.x/manual/async.html

要点: 1.参考Do not use System.out.println in server side code 明确提到 I/O 操作速度较慢。

2 和 3。您应该使用下面提到的 logback.xml 来配置您的日志记录,以便您可以利用基于 priority/requirement 的 enabling/disabling 日志记录。在此示例中,DEBUG 被禁用,同样,您也可以禁用 INFO,这将适用于您的情况。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
        <charset>UTF-8</charset>
        <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-6level%logger{0} [%X{api_id}-%X{org}-%X{user}-%X{client_req_id}]- %msg%n</pattern>
    </encoder>
</appender>

<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">      
    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
         <charset>UTF-8</charset>
        <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-6level%logger{0} [%X{api_id}-%X{org}-%X{user}-%X{client_req_id}]- %msg%n</Pattern>
    </encoder>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <FileNamePattern>${user.home}/logs/%d{yyyy_MM_dd}_server.log</FileNamePattern>
    </rollingPolicy>
</appender>

<logger name="org." level="DEBUG" additivity="false">
    <appender-ref ref="CONSOLE" />
    <appender-ref ref="FILE" />
</logger>

<root level="ERROR">
    <appender-ref ref="CONSOLE" />
    <appender-ref ref="FILE" />
</root>