2016-03-03 35 views
1

我之前使用System.out.println在Netbeans中查看我的java控制檯應用程序的輸出。是否有可能加快log4j或slf4j輸出(也可能全局關閉它們)?

程序花費了大約10分鐘運行並顯示運行時的輸出。

現在我已經取代所有System.out.println'sslf4j'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當地罐子到NetBeans項目,並增加了進口

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

因爲我只是做了這麼多,而且由於輸出顯示紅色Netbeans的控制檯上,我假設輸出沒有寫入磁盤。

如果是這樣,有兩個問題:
1.是log4jslf4j輸出已知比System.out.println慢?
2.有什麼方法可以加快輸出嗎? (可能因爲一些可能被禁用的內部檢查而變得很慢)
3.我需要我的程序運行得很快。是否有辦法全局關閉日誌記錄,而不是去查看每個文件並註釋掉logger.info()語句?

+2

哇,如果日誌加入18分鐘的加時賽的時候,你必須像產生一個極大的日誌信息。 – Andreas

+0

@Andreas:是的,有兩個功能;一個叫25000次,另一個叫6400萬次。這些函數每個都有一個輸出語句。註釋掉所有輸出,程序在45秒內執行(與啓用輸出的10分鐘和28分鐘相比)。但是這繼續顯示出輸出是多麼昂貴。不知怎的,我覺得如果設計得很好,輸出/記錄功能可能在計算上花費較少。我當然會刪除我的一些輸出語句... – Nav

+0

因此,您的原始代碼是將6400萬行輸出寫入控制檯?它們的滾動速度比讀取它們的速度快並且消失,所以這有什麼意義呢?減少你的日誌。即使你將輸出重定向到一個文件,那也是太多的日誌記錄。 – Andreas

回答

2

明智之處: 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> 

+0

非常感謝Bhavesh,但它不是'System.out',它正在減慢程序。這是slf4j日誌記錄所做的。這就是我問的原因。我認爲'logback'必須單獨指定才能與slf4j一起使用。它是否直接工作? slf4j如何知道'logback.xml'的位置? – Nav

+0

在運行jar文件時添加此參數===> java -jar -Dlogging.config = file:// $ HOME/$ PATH_TO_CONFIG/{application_name} -logback.xml xyz.jar' – Bhavesh

2

如果wan't避免日誌消息結構(String實例化)的成本使用對數級的條件的日誌記錄,並適當地利用水平(即infowarn等)。 說你提高日誌級別warnerror登陸後,您的配置文件,正確使用logger是:

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

這應該加速比整體代碼執行,並且是針對性能進行優化代碼的首選方法。

二,使用AsyncAppender除非你有非常具體的同步記錄的要求。這將進一步提高性能。請參閱https://logging.apache.org/log4j/2.x/manual/async.html

相關問題