`
k1280000
  • 浏览: 202659 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

logback.xml immediate=false 到底缓存空间是多大

 
阅读更多

 

从logback官方网站上来,immediateFlush设置成false以后有5 quintuple倍吞吐量的提升,但是,会有部分缓存的日志不会输出到日志文件里,如果这时,appender遇到错误会导致缓存的部分丢失,但是,丢失到底是多少呢?

官方没有说明了,那么只有深挖到logback里面去看一下到底是多少了,干起来!

 

Immediate flushing of the output stream ensures that logging events are immediately written to disk and will not be lost in case your application exits without properly closing appenders. On the other hand, setting this property to 'false' is likely to quintuple (your mileage may vary) logging throughput. As mentioned previously, if immediateFlush is set to 'false' and if appenders are not closed properly when your application exits, then logging events not yet written to disk may be lost.

Below is a sample configuration for a FileAppender containing a PatternLayoutEncoder with its immediateFlush property set to 'false'.

<appender name="FILE" class="ch.qos.logback.core.FileAppender"> 
  <file>foo.log</file>
  <encoder>
    <pattern>%d %-5level [%thread] %logger{0}: %msg%n</pattern>
    <!-- this quadruples logging throughput -->
    <immediateFlush>false</immediateFlush>
  </encoder> 
</appender>

 

开始找!!!!!! 

 找到设置的地方 

       ch.qos.logback.core.rolling.RollingFileAppender

 

找到父类里面的

ch.qos.logback.core.OutputStreamAppender#writeOut

这个方法里面我们可以看到用

 

protected void writeOut(E event) throws IOException {
    this.encoder.doEncode(event);
  }
 用encode来doEncode事件的。

 

 

 

往往下走到

ch.qos.logback.core.encoder.LayoutWrappingEncoder#doEncode

 

public void doEncode(E event) throws IOException {
    String txt = layout.doLayout(event);
    outputStream.write(convertToBytes(txt));
    if (immediateFlush)
      outputStream.flush();
  }
 

 

ok,看到outputStream.flush,但是是immediateFlush=true的时候flush的,那么问题来了,

immediateFlush=false是怎么样的呢???

 

思考一下!!!

找到这个OutputStream具体实现类

找到encoder里面怎么接收到这个outputStream的

ch.qos.logback.core.encoder.LayoutWrappingEncoder#init

那么谁会调用encoder的init方法呢,想一下,应该是appender,去看一看

ch.qos.logback.core.OutputStreamAppender#encoderInit

ch.qos.logback.core.OutputStreamAppender#setOutputStream

ch.qos.logback.core.FileAppender#openFile

 

public void openFile(String file_name) throws IOException {
    lock.lock();
    try {
      File file = new File(file_name);
      if (FileUtil.isParentDirectoryCreationRequired(file)) {
        boolean result = FileUtil.createMissingParentDirectories(file);
        if (!result) {
          addError("Failed to create parent directories for ["
              + file.getAbsolutePath() + "]");
        }
      }

      ResilientFileOutputStream resilientFos = new ResilientFileOutputStream(
          file, append);
      resilientFos.setContext(context);
      setOutputStream(resilientFos);
    } finally {
      lock.unlock();
    }
  }
 

 

看到了ResilientFileOutputStream这个包装类!!! happy一下,快到了

 

public ResilientFileOutputStream(File file, boolean append)
      throws FileNotFoundException {
    this.file = file;
    fos = new FileOutputStream(file, append);
    this.os = new BufferedOutputStream(fos);
    this.presumedClean = true;
  }
 

 

可以看到os实质是一个 BufferedOutputStream ,OK,这就对了

 

/**
     * Creates a new buffered output stream to write data to the
     * specified underlying output stream.
     *
     * @param   out   the underlying output stream.
     */
    public BufferedOutputStream(OutputStream out) {
        this(out, 8192);
    }
 如果是这样的话,那么logback的outputStream是BufferedOutputStream,那么它的缓冲是8192也就是8K.

 

 

整个查找过程蛮有意思的,找时间写个代码去验证一下!!大笑

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论
1 楼 tcgdy0201 2015-12-19  
挖!博主好棒!博主好腻害!

相关推荐

    Logback类库含logback.xml配置文件

    `logback.xml` 配置文件是 Logback 框架的核心部分,用于定制日志行为。它允许你定义日志级别(如 TRACE, DEBUG, INFO, WARN, ERROR, FATAL 和 OFF),指定日志输出目的地(控制台、文件、数据库等),以及配置过滤...

    logback jar包和logback.xml配置文件打包下载 小白新手学Java

    在这里,我们关注的是SLF4J的API库`slf4j-api-1.7.26.jar`,以及Logback的两个核心组件`logback-core-1.2.3.jar`和`logback-classic-1.2.3.jar`,以及配置文件`logback.xml`。 首先,`slf4j-api-1.7.26.jar`是SLF4J...

    docker安装nacos报错nacos-logback.xml找不到

    docker安装nacos报错nacos-logback.xml找不到,把该文件放入相应的文件夹中即可

    logback.xml文件

    下载配置好文件后,更改file和fileNamePattern,修改为自己的地址,可以随机指定一个文件夹

    logback的使用和logback.xml详解

    标题"Logback的使用和logback.xml详解"暗示了我们要讨论的是一个日志管理框架——Logback,以及它的配置文件`logback.xml`。Logback是Java社区广泛使用的日志处理系统,由Ceki Gülcü创建,作为Log4j的后继者。它...

    logback.xml按日期再按大小输出日志 配置

    该配置使日志先按日期进行归类,然后按大小输出异步日志

    slf4j,logback.xml

    slf4j,logback.xml

    这是logback.xml,配和3个jar包组成日志使用

    这是自己logback.xml的,很容易理解,配合3个jar包可以对日志进行操作,日志存放位置和输出多少日志内容都可以在里面进行设置,3个jar包下载步骤在我的文章里面有写

    logback.xml

    springboot自定义日志格式配置logback.xml,及spring-logback.xml是否支持spring Profiles的配置

    在logback.xml中自定义动态属性的方法

    在探讨如何在logback.xml中自定义动态属性之前,我们先了解一下logback本身。Logback是一个Java语言编写的日志框架,它是log4j的升级版。Logback不仅提供了全面的日志记录功能,而且还能很好地与SLF4J(Simple ...

    logbackーslf4j-配置文件实例 难得

    Logback的配置主要通过`logback.xml`文件完成,这是一个XML格式的配置文件,用于定义日志级别、日志输出目的地、过滤器等。以下是一份基本的`logback.xml`配置示例: ```xml &lt;appender name="STDOUT" class="ch....

    slf4j日志demo项目 logback.xml配置详解

    slf4j日志demo项目 logback.xml配置详解,slf4j日志demo项目 logback.xml配置详解,slf4j日志demo项目 logback.xml配置详解,slf4j日志demo项目 logback.xml配置详解

    Java的日志配置文件 logback.xml

    本文将详细介绍Java的日志配置文件`logback.xml`及其相关知识点。 首先,`logback.xml`是Logback框架的配置文件,用于定义日志的级别、输出目的地、格式以及过滤器等。配置文件通常位于项目的类路径根目录下,以...

    logback.xml以及mybatis-config.xml

    logback.xml以及mybatis-config.xml

    logback-dev.xml.zip

    &lt;appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"&gt; &lt;pattern&gt;%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n ``` 这段代码定义了一个名为"STDOUT"的控制台appender,...

    Tomcat日志catalina.out过大解决方案--使用logback按日轮转.rar

    ch.qos.logback.classic.AsyncAppender.additivity = false 1.org.apache.juli.FileHandler.level = FINE 1.org.apache.juli.FileHandler.directory = ${catalina.base}/logs 1.org.apache.juli.FileHandler.prefix...

Global site tag (gtag.js) - Google Analytics