我之前使用 System.out.println
在 Netbeans 中查看我的 java 控制台应用程序的输出。
该程序花了大约 10 分钟 运行并在运行时显示输出。
现在我用slf4j的
记录器替换了所有的System.out.println的
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()
语句?
最佳答案
要点: 1.引用Do not use System.out.println in server side code 明确提到 I/O 操作较慢。
2 和 3. 您应该使用下面提到的 logback.xml 来配置您的日志记录,以便您可以根据优先级/要求启用/禁用日志记录。在此示例中,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>
关于java - 是否有可能加速 log4j 或 slf4j 输出(也可能全局关闭它们)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35764456/