2015-10-16 48 views
0

我在java環境中使用java日誌記錄(默認提供的那個日誌記錄)。如何減少Java中登錄的頻率?

我想問我怎樣才能聚合我的閱讀和日誌讓我們說每秒一次而不是更頻繁(我似乎每秒記錄20次)。 這怎麼能做到?

有沒有什麼設置可以用來將數據壓入文件的頻率更低? 我從來沒有登錄過,所以我不確定是否有可能。謝謝。

編輯:我記錄響應時間,吞吐量和類似的東西。由於我的程序很重,我希望jul緩衝和記錄的次數較少。

+0

我會說你不需要做這個,因爲日誌框架應該是緩衝。我看到這記錄log4j,所以我認爲朱爾也是這樣做。 – Marged

+0

什麼樣的日誌記錄?記錄到文件的程序的行爲?或者按照日誌記錄來調試你的程序,比如「System.out ...」? –

+0

程序測量。 – LoveMeow

回答

2

要使用JUL自定義日誌記錄,您可以編寫自己的Handler實現。如果你想登錄到一個文件,你應該延長FileHandler。使用ConsoleHandler可能看起來像這樣實現:

package my.logging; 

import java.util.Queue; 
import java.util.concurrent.*; 
import java.util.logging.ConsoleHandler; 
import java.util.logging.LogRecord; 

public class BufferingHandler extends ConsoleHandler implements AutoCloseable { 

    private final Queue<LogRecord> logRecordsFifo = new ConcurrentLinkedQueue<>(); 
    private final ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(); 

    public BufferingHandler(final int delay, final TimeUnit timeUnit) { 
     super(); 
     scheduler.scheduleWithFixedDelay(() -> handleLogs(), delay, delay, timeUnit); 
    } 

    private void handleLogs() { 
     while (!logRecordsFifo.isEmpty()) { 
      // sync is required to preserve logs order when flushing 
      synchronized (logRecordsFifo) { 
       final LogRecord log = logRecordsFifo.poll(); 
       if (log != null) super.publish(log); 
      } 
     } 
    } 

    @Override 
    public void publish(final LogRecord record) { 
     if (!isLoggable(record)) return; 
     logRecordsFifo.add(record); 
    } 

    @Override 
    public void flush() { 
     handleLogs(); 
     super.flush(); 
    } 

    @Override 
    public void close() { 
     scheduler.shutdown(); 
     flush(); 
     super.close(); 
    } 
} 

這個處理器的使用可能看起來像這樣:

import my.logging.BufferingHandler; 

import java.util.concurrent.TimeUnit; 
import java.util.logging.Logger; 

public class App { 

    public static void main(String[] args) throws InterruptedException { 
     final Logger logger = Logger.getLogger(App.class.getName()); 
     try (final BufferingHandler bufferingHandler = new BufferingHandler(1, TimeUnit.SECONDS)) { 
      logger.addHandler(bufferingHandler); 
      for (int i = 0; i < 30; ++i) { 
       Thread.sleep(200); 
       logger.info("some info: " + i); 
      } 
     } 
    } 

} 
+0

在登錄我的emasure之前,我是否還需要線程睡眠?或者是否足以在bufferingHandler中指定時間 – LoveMeow

+1

您不這樣做,它只是一個示例,表明它每秒都會寫入聚合日誌。是的,這足以在BufferingHandler構造函數中指定時間。 –

+0

@LoveMeow它會回答你的問題嗎? –