摘要:既能設置大小,也能定時刷新無論是否達到設定的大小的適用于既想使用的提高性能,又想定時強制輸出以不影響某些依賴日志輸出的后續流程的場景默認的默認的定時刷新間隔秒下一次刷新的時間點默認的默認的至少秒本必須是否則沒意義配置使用樣例
</>復制代碼
package test;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.apache.log4j.DailyRollingFileAppender;
import org.apache.log4j.Layout;
/**
* 既能設置buffer大小,也能定時刷新(無論是否達到設定的buffer大小)的appender;適用于既想使用buffer的IO提高性能,又想定時強制輸出以不影響某些依賴日志輸出的后續流程的場景
*
* @author pf-miles
* @since 2015-4-7
*/
public class TimedBufferedDailyRollingFileAppender extends DailyRollingFileAppender {
private static final int CHECK_INTERVAL = 5;
private static final Object appendersLock = new Object();
private static final List appenders = new ArrayList();
static {
new Thread(new Runnable() {
public void run() {
while (true) {
try {
synchronized (appendersLock) {
for (TimedBufferedDailyRollingFileAppender appender : appenders)
appender.flush();
}
Thread.sleep(CHECK_INTERVAL * 1000);
} catch (Throwable t) {
// ignore...
}
}
}
}, "TimedBufferedDailyRollingFileAppender-timed-flush").start();
}
private static final int DEFAULT_BUFFER_SIZE = 1024 * 1024; // 默認1MB的buffer
protected int flushInterval = 60; // 默認的定時刷新間隔(秒)
private Date flushTime = new Date(); // 下一次刷新的時間點
public TimedBufferedDailyRollingFileAppender(){
super();
this.setBufferedIO(true);
this.setBufferSize(DEFAULT_BUFFER_SIZE);// 默認1MB的buffer
this.setImmediateFlush(false);
synchronized (appendersLock) {
appenders.add(this);
}
}
public TimedBufferedDailyRollingFileAppender(Layout layout, String filename, String datePattern) throws IOException{
super(layout, filename, datePattern);
this.setBufferedIO(true);
this.setBufferSize(DEFAULT_BUFFER_SIZE);// 默認1MB的buffer
this.setImmediateFlush(false);
synchronized (appendersLock) {
appenders.add(this);
}
}
private void flush() {
if (!(new Date()).after(flushTime)) return;
if (!checkEntryConditions()) return;
qw.flush();
this.flushTime = new Date(System.currentTimeMillis() + this.flushInterval * 1000);
}
public void setFlushInterval(int flushInterval) {
if (flushInterval < CHECK_INTERVAL) flushInterval = CHECK_INTERVAL;// 至少CHECK_INTERVAL秒
this.flushInterval = flushInterval;
}
// 本appender必須是bufferedIO, 否則沒意義
@Override
public boolean getBufferedIO() {
return true;
}
@Override
public void setBufferedIO(boolean bufferedIO) {
super.setBufferedIO(true);
}
@Override
public void setImmediateFlush(boolean value) {
super.setImmediateFlush(false);
}
@Override
public boolean getImmediateFlush() {
return false;
}
}
配置使用樣例:
</>復制代碼
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/64331.html
摘要:理解在記錄消息中的日志的不同級別是非常重要的。通常來說,當為指定了一個該會包含當前指定級別以及更高級別的日志。,將消息發送至單個一般文件或一個可回滾的文件集合。 本文網大多網絡整理所得,出處太多,不一一列舉 簡介 Java 中的 Logging API 讓 Java 應用可以記錄不同級別的信息,它在debug過程中非常有用,如果系統因為各種各樣的原因而崩潰,崩潰原因可以在日志中清晰地追...
摘要:配置文件學習筆記定義運行的用戶和用戶組進程數,建議設置為等于總核心數全局錯誤日志定義類型,進程文件指定進程可以打開的最大描述符數目工作模式與連接數上限這個指令是指當一個進程打開的最多文件描述符數目,理論值應該是最多打開文件數與進程數相除, Nginx配置文件學習筆記 定義Nginx運行的用戶和用戶組 user nginx; Nginx進程數,建議設置為等于CPU總核心數 worker...
摘要:配置文件學習筆記定義運行的用戶和用戶組進程數,建議設置為等于總核心數全局錯誤日志定義類型,進程文件指定進程可以打開的最大描述符數目工作模式與連接數上限這個指令是指當一個進程打開的最多文件描述符數目,理論值應該是最多打開文件數與進程數相除, Nginx配置文件學習筆記 定義Nginx運行的用戶和用戶組 user nginx; Nginx進程數,建議設置為等于CPU總核心數 worker...
閱讀 1282·2023-04-25 23:22
閱讀 1681·2023-04-25 20:04
閱讀 2655·2021-11-22 15:24
閱讀 2817·2021-11-11 16:54
閱讀 1894·2019-08-30 14:03
閱讀 1493·2019-08-29 16:35
閱讀 1711·2019-08-26 10:29
閱讀 2680·2019-08-23 18:01