资讯专栏INFORMATION COLUMN

分享代码片段:既能设置buffer大小,也能定时刷新(无论是否达到设定的buffer大小)的log4

xuxueli / 2490人阅读

摘要:既能设置大小,也能定时刷新无论是否达到设定的大小的适用于既想使用的提高性能,又想定时强制输出以不影响某些依赖日志输出的后续流程的场景默认的默认的定时刷新间隔秒下一次刷新的时间点默认的默认的至少秒本必须是否则没意义配置使用样例

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 日志系列篇一 原生 Java.util.logging

    摘要:理解在记录消息中的日志的不同级别是非常重要的。通常来说,当为指定了一个该会包含当前指定级别以及更高级别的日志。,将消息发送至单个一般文件或一个可回滚的文件集合。 本文网大多网络整理所得,出处太多,不一一列举 简介 Java 中的 Logging API 让 Java 应用可以记录不同级别的信息,它在debug过程中非常有用,如果系统因为各种各样的原因而崩溃,崩溃原因可以在日志中清晰地追...

    tainzhi 评论0 收藏0
  • nginx配置详解

    摘要:配置文件中文详解定义运行的用户和用户组进程数,建议设置为等于总核心数。但也有超过的情况,但是该值必须设置为系统分页大小的整倍数。开启限制连接数的时候需要使用负载均衡配置的负载均衡,是权重,可以根据机器配置定义权重。 Nginx配置文件nginx.conf中文详解 #定义Nginx运行的用户和用户组 user www www; #nginx进程数,建议设置为等于CPU总核心数。 wor...

    wums 评论0 收藏0
  • Nginx配置文件学习笔记

    摘要:配置文件学习笔记定义运行的用户和用户组进程数,建议设置为等于总核心数全局错误日志定义类型,进程文件指定进程可以打开的最大描述符数目工作模式与连接数上限这个指令是指当一个进程打开的最多文件描述符数目,理论值应该是最多打开文件数与进程数相除, Nginx配置文件学习笔记 定义Nginx运行的用户和用户组 user nginx; Nginx进程数,建议设置为等于CPU总核心数 worker...

    muddyway 评论0 收藏0
  • Nginx配置文件学习笔记

    摘要:配置文件学习笔记定义运行的用户和用户组进程数,建议设置为等于总核心数全局错误日志定义类型,进程文件指定进程可以打开的最大描述符数目工作模式与连接数上限这个指令是指当一个进程打开的最多文件描述符数目,理论值应该是最多打开文件数与进程数相除, Nginx配置文件学习笔记 定义Nginx运行的用户和用户组 user nginx; Nginx进程数,建议设置为等于CPU总核心数 worker...

    MoAir 评论0 收藏0

发表评论

0条评论

xuxueli

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<