异步日志实现的源码解析

本文探讨了同步日志与异步日志的区别,重点解析了logback的异步日志实现。logback通过使用有界队列避免内存溢出,日志记录方法将日志放入队列,由单独的线程处理。分析了核心类及其成员变量,展示了如何创建和绑定日志处理器,以及如何处理日志入列和丢弃策略。
摘要由CSDN通过智能技术生成

同步日志与异步日志

同步日志打印模型的缺点是将日志写入磁盘的操作是由业务线程同步调用完成的;当业务线程把要打印的日志放入一个队列后直接返回,然后用一个线程专门负责从队列中取出日志任务并写入磁盘时,就成为了异步日志。

logback的核心实现

以下描述异步日志logback的实现。
logback的类图结构如下:
在这里插入图片描述
其中主要的功能在AsyncAppenderBase中实现。
该类的一些成员变量:

    AppenderAttachableImpl<E> aai = new AppenderAttachableImpl<E>();	//一个appender的装饰器,里面存放同步日志的appender,worker线程里使用的就是这个appender
    BlockingQueue<E> blockingQueue;	在start方法初始化为一个ArrayBlockingQueue

    public static final int DEFAULT_QUEUE_SIZE = 256;	//默认队列大小
    int queueSize = DEFAULT_QUEUE_SIZE;

    int appenderCount = 0;	//记录aai里面附加的同步appender的个数

    static final int UNDEFINED = -1;
    int discardingThreshold = UNDEFINED;	//开始丢弃某些级别日志的队列大小阈值
    boolean neverBlock = false;	//日志队列满时是否阻塞

    Worker worker = new Worker();	//日志的消费者

    /**
     * The default maximum queue flush time allowed during appender stop. If the 
     * worker takes longer than this time it will exit, discarding any remaining 
     * items in the queue
     */
    public static final int DEFAULT_MAX_FLUSH_TIME = 1000;
    int maxFlushTime = DEFAULT_MAX_FLUSH_TIME;

在解析完AsyncAppenderBase的xml配置文件后将调用AsyncAppenderBasestart方法:

    @Override
    public void start() {
   
        if 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值