是否有可能加速 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.1
和 slf4j-simple:1.7.18
的本地 jar 添加到 Netbeans 项目中并添加了导入
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
因为我只做了这么多,并且因为输出以红色显示在 Netbeans 控制台上,所以我假设输出没有被写入磁盘。
如果是,两个问题:
1. 是否已知 log4j
或 slf4j
输出比 System.out.println
慢?
2. 有什么办法可以加快输出速度吗? (可能是因为一些可以禁用的内部检查,所以速度很慢?)
3. 我需要我的程序 运行 快。有没有办法全局关闭日志记录,而不是转到每个文件并注释掉 logger.info()
语句?
如果您不想避免构建日志消息的成本(String
实例化),请在日志级别和利用级别(即 info
、warn
等)上使用条件日志记录适当地。
假设您在日志记录配置文件中将日志记录级别提高到 warn
或 error
,正确使用 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>
我之前使用 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.1
和 slf4j-simple:1.7.18
的本地 jar 添加到 Netbeans 项目中并添加了导入
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
因为我只做了这么多,并且因为输出以红色显示在 Netbeans 控制台上,所以我假设输出没有被写入磁盘。
如果是,两个问题:
1. 是否已知 log4j
或 slf4j
输出比 System.out.println
慢?
2. 有什么办法可以加快输出速度吗? (可能是因为一些可以禁用的内部检查,所以速度很慢?)
3. 我需要我的程序 运行 快。有没有办法全局关闭日志记录,而不是转到每个文件并注释掉 logger.info()
语句?
如果您不想避免构建日志消息的成本(String
实例化),请在日志级别和利用级别(即 info
、warn
等)上使用条件日志记录适当地。
假设您在日志记录配置文件中将日志记录级别提高到 warn
或 error
,正确使用 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>