摘要:既能设置大小,也能定时刷新无论是否达到设定的大小的适用于既想使用的提高性能,又想定时强制输出以不影响某些依赖日志输出的后续流程的场景默认的默认的定时刷新间隔秒下一次刷新的时间点默认的默认的至少秒本必须是否则没意义配置使用样例
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;
}
}
配置使用样例:
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/64331.html
摘要:理解在记录消息中的日志的不同级别是非常重要的。通常来说,当为指定了一个该会包含当前指定级别以及更高级别的日志。,将消息发送至单个一般文件或一个可回滚的文件集合。 本文网大多网络整理所得,出处太多,不一一列举 简介 Java 中的 Logging API 让 Java 应用可以记录不同级别的信息,它在debug过程中非常有用,如果系统因为各种各样的原因而崩溃,崩溃原因可以在日志中清晰地追...
摘要:配置文件学习笔记定义运行的用户和用户组进程数,建议设置为等于总核心数全局错误日志定义类型,进程文件指定进程可以打开的最大描述符数目工作模式与连接数上限这个指令是指当一个进程打开的最多文件描述符数目,理论值应该是最多打开文件数与进程数相除, Nginx配置文件学习笔记 定义Nginx运行的用户和用户组 user nginx; Nginx进程数,建议设置为等于CPU总核心数 worker...
摘要:配置文件学习笔记定义运行的用户和用户组进程数,建议设置为等于总核心数全局错误日志定义类型,进程文件指定进程可以打开的最大描述符数目工作模式与连接数上限这个指令是指当一个进程打开的最多文件描述符数目,理论值应该是最多打开文件数与进程数相除, Nginx配置文件学习笔记 定义Nginx运行的用户和用户组 user nginx; Nginx进程数,建议设置为等于CPU总核心数 worker...
阅读 1617·2023-04-25 23:22
阅读 1925·2023-04-25 20:04
阅读 2825·2021-11-22 15:24
阅读 2945·2021-11-11 16:54
阅读 2118·2019-08-30 14:03
阅读 1685·2019-08-29 16:35
阅读 1867·2019-08-26 10:29
阅读 3143·2019-08-23 18:01