Log4j2中RollingFile的文件滚动更新机制

一、什么是RollingFile

RollingFileAppender是Log4j2中的一种能够实现日志文件滚动更新(rollover)的Appender。

rollover的意思是当满足一定条件(如文件达到了指定的大小,达到了指定的时间)后,就重命名原日志文件进行归档,并生成新的日志文件用于log写入。如果还设置了一定时间内允许归档的日志文件的最大数量,将对过旧的日志文件进行删除操作。

RollingFile实现日志文件滚动更新,依赖于TriggeringPolicy和RolloverStrategy。

其中,TriggeringPolicy为触发策略,其决定了何时触发日志文件的rollover,即When。

RolloverStrategy为滚动更新策略,其决定了当触发了日志文件的rollover时,如何进行文件的rollover,即How。

Log4j2提供了默认的rollover策略DefaultRolloverStrategy。

下面通过一个log4j2.xml文件配置简单了解RollingFile的配置。


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

<?xml version="1.0" encoding="UTF-8"?>

<Configuration status="warn">

  <Appenders>

    <RollingFile name="RollingFile" fileName="logs/app.log"

                 filePattern="logs/app-%d{yyyy-MM-dd HH}.log">

      <PatternLayout>

        <Pattern>%d %p %c{1.} [%t] %m%n</Pattern>

      </PatternLayout>

      <Policies>

        <TimeBasedTriggeringPolicy interval="1"/>

        <SizeBasedTriggeringPolicy size="250MB"/>

      </Policies>

    </RollingFile>

  </Appenders>

  <Loggers>

    <Root level="error">

      <AppenderRef ref="RollingFile"/>

    </Root>

  </Loggers>

</Configuration>

上述配置文件中配置了一个RollingFile,日志写入logs/app.log文件中,每经过1小时或者当文件大小到达250M时,按照app-2017-08-01 12.log的格式对app.log进行重命名并归档,并生成新的文件用于写入log。

其中,fileName指定日志文件的位置和文件名称(如果文件或文件所在的目录不存在,会创建文件。)

filePattern指定触发rollover时,文件的重命名规则。filePattern中可以指定类似于SimpleDateFormat中的date/time pattern,如yyyy-MM-dd HH,或者%i指定一个整数计数器。

TimeBasedTriggeringPolicy指定了基于时间的触发策略。
SizeBasedTriggeringPolicy指定了基于文件大小的触发策略。

二、TriggeringPolicy

RollingFile的触发rollover的策略有CronTriggeringPolicy(Cron表达式触发)、OnStartupTriggeringPolicy(JVM启动时触发)、SizeBasedTriggeringPolicy(基于文件大小)、TimeBasedTriggeringPolicy(基于时间)、CompositeTriggeringPolicy(多个触发策略的混合,如同时基于文件大小和时间)。

其中,SizeBasedTriggeringPolicy(基于日志文件大小)、TimeBasedTriggeringPolicy(基于时间)或同时基于文件大小和时间的混合触发策略最常用。

SizeBasedTriggeringPolicy

SizeBasedTriggeringPolicy规定了当日志文件达到了指定的size时,触发rollover操作。size参数可以用KB、MB、GB等做后缀来指定具体的字节数,如20MB。

<SizeBasedTriggeringPolicy size="250MB"/>

TimeBasedTriggeringPolicy

TimeBasedTriggeringPolicy规定了当日志文件名中的date/time pattern不再符合filePattern中的date/time pattern时,触发rollover操作。

比如,filePattern指定文件重命名规则为app-%d{yyyy-MM-dd HH}.log,文件名为app-2017-08-25 11.log,当时间达到2017年8月25日中午12点(2017-08-25 12),将触发rollover操作。


参数名

类型

描述
interval integer
此参数需要与filePattern结合使用,规定了触发rollover的频率,默认值为1。假设interval为4,若filePattern的date/time pattern的最小时间粒度为小时(如yyyy-MM-dd HH),则每4小时触发一次rollover;若filePattern的date/time pattern的最小时间粒度为分钟(如yyyy-MM-dd HH-mm),则每4分钟触发一次rollover。

modulate boolean
指明是否对interval进行调节,默认为false。若modulate为true,会以0为开始对interval进行偏移计算。例如,最小时间粒度为小时,当前为3:00,interval为4,则以后触发rollover的时间依次为4:00,8:00,12:00,16:00,...。


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

<?xml version="1.0" encoding="UTF-8"?>

<Configuration status="warn" name="MyApp" packages="">

  <Appenders>

    <RollingFile name="RollingFile" fileName="logs/app.log"

                 filePattern="logs/app-%d{yyyy-MM-dd HH}-%i.log">

      <PatternLayout>

        <Pattern>%d %p %c{1.} [%t] %m%n</Pattern>

      </PatternLayout>

      <Policies>

        <TimeBasedTriggeringPolicy />

        <SizeBasedTriggeringPolicy size="250 MB"/>

      </Policies>

    </RollingFile>

  </Appenders>

  <Loggers>

    <Root level="error">

      <AppenderRef ref="RollingFile"/>

    </Root>

  </Loggers>

</Configuration>

上述配置文件中,filePattern中yyyy-MM-dd HH最小时间粒度为小时,TimeBasedTriggeringPolicy中interval使用默认值1,将每1小时触发一次rollover。

若将filePattern改为filePattern=“logs/app-%d{yyyy-MM-dd HH-mm}-%i.log”,yyyy-MM-dd HH-mm最小时间粒度为分钟,将每1分钟触发一次rollover。

CompositeTriggeringPolicy

将多个TriggeringPolicy放到Policies中表示使用复合策略

<Policies>

    <TimeBasedTriggeringPolicy />

    <SizeBasedTriggeringPolicy size="250 MB"/>

</Policies>

如上,同时使用了TimeBasedTriggeringPolicy、SizeBasedTriggeringPolicy,有一个条件满足,就会触发rollover。

三、DefaultRolloverStrategy

DefaultRolloverStrategy指定了当触发rollover时的默认策略。

DefaultRolloverStrategy是Log4j2提供的默认的rollover策略,即使在log4j2.xml中没有显式指明,也相当于为RollingFile配置下添加了如下语句。DefaultRolloverStrategy默认的max为7。

<DefaultRolloverStrategy max="7"/>

max参数指定了计数器的最大值。一旦计数器达到了最大值,过旧的文件将被删除。

注意:不要认为max参数是需要保留的日志文件的最大数目。

max参数是与filePattern中的计数器%i配合起作用的,其具体作用方式与filePattern的配置密切相关。

1.如果filePattern中仅含有date/time pattern,每次rollover时,将用当前的日期和时间替换文件中的日期格式对文件进行重命名。max参数将不起作用。

如,filePattern="logs/app-%d{yyyy-MM-dd}.log"

2.如果filePattern中仅含有整数计数器(即%i),每次rollover时,文件重命名时的计数器将每次加1(初始值为1),若达到max的值,将删除旧的文件。

如,filePattern="logs/app-%i.log"

3.如果filePattern中既含有date/time pattern,又含有%i,每次rollover时,计数器将每次加1,若达到max的值,将删除旧的文件,直到data/time pattern不再符合,被替换为当前的日期和时间,计数器再从1开始。

如,filePattern="logs/app-%d{yyyy-MM-dd HH-mm}-%i.log"

假设fileName为logs/app.log,SizeBasedTriggeringPolicy的size为10KB,DefaultRolloverStrategy的max为3。

根据filePattern配置的不同分为以下几种情况:

情况1:filePattern中仅含有date/time pattern


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

<?xml version="1.0" encoding="UTF-8"?>

<Configuration status="trace" name="MyApp" packages="">

    <Appenders>

        <Console name="Console" target="SYSTEM_OUT">

            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />

        </Console>

        <RollingFile name="RollingFile" fileName="logs/app.log"

        filePattern="logs/app-%d{yyyy-MM-dd}.log">

            <PatternLayout>

                <Pattern>%d %p %c{1.} [%t] %m%n</Pattern>

            </PatternLayout>

            <Policies>

                <SizeBasedTriggeringPolicy size="10KB"/>

            </Policies>

            <DefaultRolloverStrategy max="3"/>

        </RollingFile>

    </Appenders>

    <Loggers>

        <Root level="trace">

            <AppenderRef ref="Console"/>

            <AppenderRef ref="RollingFile"/>

        </Root>

    </Loggers>

</Configuration>

filePattern="logs/app-%d{yyyy-MM-dd}.log",指定当发生rollover时,将按照app-%d{yyyy-MM-dd}.log的格式对文件进行重命名。

每次触发rollover时,将按照如下方式对文件进行rollover。


第X次rollover

当前用于写入log的文件

归档的文件

描述
0 app.log - 所有的log都写进app.log中。
1 app.log app-2017-08-17.log
当app.log的size达到10KB,触发第1次rollover,app.log被重命名为app-2017-08-17.log。新的app.log被创建出来,用于写入log。

2 app.log
app-2017-08-17.log


当app.log的size达到10KB,触发第2次rollover,原来的app-2017-08-17.log将删除。app.log被重命名为app-2017-08-17.log。新的app.log文件被创建出来,用于写入log。

情况2:filePattern中仅含有整数计数器(%i)


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

<?xml version="1.0" encoding="UTF-8"?>

<Configuration status="trace" name="MyApp" packages="">

    <Appenders>

        <Console name="Console" target="SYSTEM_OUT">

            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />

        </Console>

        <RollingFile name="RollingFile" fileName="logs/app.log"

        filePattern="logs/app-%i.log">

            <PatternLayout>

                <Pattern>%d %p %c{1.} [%t] %m%n</Pattern>

            </PatternLayout>

            <Policies>

                <SizeBasedTriggeringPolicy size="10KB"/>

            </Policies>

            <DefaultRolloverStrategy max="3"/>

        </RollingFile>

    </Appenders>

    <Loggers>

        <Root level="trace">

            <AppenderRef ref="Console"/>

            <AppenderRef ref="RollingFile"/>

        </Root>

    </Loggers>

</Configuration>

filePattern="logs/app-%i.log",其余配置同上。

每次触发rollover时,将按照如下方式对文件进行rollover。


第X次rollover

当前用于写入log的文件

归档的文件

描述
0 app.log - 所有的log都写进app.log中。
1 app.log app-1.log
当app.log的size达到10KB,触发第1次rollover,app.log被重命名为app-1.log。新的app.log被创建出来,用于写入log。

2 app.log
app-1.log

app-2.log


当app.log的size达到10KB,触发第2次rollover,app.log被重命名为app-2.log。新的app.log被创建出来,用于写入log。

3 app.log
app-1.log

app-2.log

app-3.log


当app.log的size达到10KB,触发第3次rollover,app.log被重命名为app-3.log。新的app.log被创建出来,用于写入log。

4 app.log
app-1.log

app-2.log

app-3.log


当app.log的size达到10KB,触发第4次rollover,app-1.log被删除(即最初的、最旧的app.log)。app-2.log被重命名为app-1.log,app-3.log被重命名为app-2.log,app.log被重命名为app-3.log。新的app.log被创建出来,用于写入log。

情况3:如果filePattern中既含有date/time pattern,又含有%i计数器


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

<?xml version="1.0" encoding="UTF-8"?>

<Configuration status="trace" name="MyApp" packages="">

    <Appenders>

        <Console name="Console" target="SYSTEM_OUT">

            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />

        </Console>

        <RollingFile name="RollingFile" fileName="logs/app.log"

        filePattern="logs/app-%d{yyyy-MM-dd HH-mm}-%i.log">

            <PatternLayout>

                <Pattern>%d %p %c{1.} [%t] %m%n</Pattern>

            </PatternLayout>

            <Policies>

                <TimeBasedTriggeringPolicy />

                <SizeBasedTriggeringPolicy size="10KB"/>

            </Policies>

            <DefaultRolloverStrategy max="3"/>

        </RollingFile>

    </Appenders>

    <Loggers>

        <Root level="trace">

            <AppenderRef ref="Console"/>

            <AppenderRef ref="RollingFile"/>

        </Root>

    </Loggers>

</Configuration>

filePattern="logs/app-%d{yyyy-MM-dd HH-mm}-%i.log",同时指定了TimeBasedTriggeringPolicy和SizeBasedTriggeringPolicy的触发策略,每1分钟或者文件大小达到10KB,将触发rollover。

每次触发rollover时,将按照如下方式对文件进行rollover。


第X次rollover

当前用于写入log的文件

归档的文件

描述
0 app.log - 所有的log都写进app.log中。
1 app.log app-2017-08-17 20-52-1.log
当app.log的size达到10KB,触发第1次rollover,app.log被重命名为app-2017-08-17 20-52-1.log。新的app.log被创建出来,用于写入log。

2 app.log
app-2017-08-17 20-52-1.log

app-2017-08-17 20-52-2.log


当app.log的size达到10KB,触发第2次rollover,app.log被重命名为app-2017-08-17 20-52-2.log。新的app.log被创建出来,用于写入log。

3 app.log
app-2017-08-17 20-52-1.log

app-2017-08-17 20-52-2.log

app-2017-08-17 20-52-3.log


当app.log的size达到10KB,触发第3次rollover,app.log被重命名为app-2017-08-17 20-52-3.log.log。新的app.log被创建出来,用于写入log。

4 app.log
app-2017-08-17 20-52-1.log

app-2017-08-17 20-52-2.log

app-2017-08-17 20-52-3.log


当app.log的size达到10KB,触发第4次rollover,因计数器的值到达max值,app-2017-08-17 20-52-1.log被删除(即最初的、最旧的app.log)。app-2017-08-17 20-52-2.log被重命名为app-2017-08-17 20-52-1.log,app-2017-08-17 20-52-3.log被重命名为app-2017-08-17 20-52-2.log,app.log被重命名为app-2017-08-17 20-52-3.log。新的app.log被创建出来,用于写入log。

5 app.log
app-2017-08-17 20-52-1.log

app-2017-08-17 20-52-2.log

app-2017-08-17 20-52-3.log

当前时间变为app-2017-08-17 20-53,触发第5次rollover,app-2017-08-17 20-52-1.log被删除。app-2017-08-17 20-52-2.log被重命名为app-2017-08-17 20-52-1.log,app-2017-08-17 20-52-3.log被重命名为app-2017-08-17 20-52-2.log,app.log被重命名为app-2017-08-17 20-52-3.log。新的app.log被创建出来,用于写入log。
6 app.log
app-2017-08-17 20-52-1.log

app-2017-08-17 20-52-2.log

app-2017-08-17 20-52-3.log

app-2017-08-17 20-53-1.log

当app.log的size达到10KB,触发第6次rollover,app.log被重命名为app-2017-08-17 20-53-1.log。新的app.log被创建出来,用于写入log。

总结:

1.max参数是与filePattern中的计数器%i配合起作用的,若filePattern为filePattern="logs/app-%d{yyyy-MM-dd}.log">,由于没有设置%i计数器,max参数将不起作用。

2.max参数不是需要保留的文件的最大个数。如情况3,日志文件date/time pattern不再符合filePattern时,计算器将被重置为1,日志总个数超过了max的指定值。

可认为max参数规定了一定时间范围内归档文件的最大个数。

四、DeleteAction

DefaultRolloverStrategy制定了默认的rollover策略,通过max参数可控制一定时间范围内归档的日志文件的最大个数。

Log4j 2.5 引入了DeleteAction,使用户可以自己控制删除哪些文件,而不仅仅是通过DefaultRolloverStrategy的默认策略。

注意:通过DeleteAction可以删除任何文件,而不仅仅像DefaultRolloverStrategy那样,删除最旧的文件,所以使用的时候需要谨慎!


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

<?xml version="1.0" encoding="UTF-8"?>

<Configuration status="warn" name="MyApp" packages="">

  <Properties>

    <Property name="baseDir">logs</Property>

  </Properties>

  <Appenders>

    <RollingFile name="RollingFile" fileName="${baseDir}/app.log"

          filePattern="${baseDir}/app-%d{yyyy-MM-dd}.log.gz">

      <PatternLayout pattern="%d %p %c{1.} [%t] %m%n" />

      <CronTriggeringPolicy schedule="0 0 0 * * ?"/>

      <DefaultRolloverStrategy>

        <Delete basePath="${baseDir}" maxDepth="2">

          <IfFileName glob="*/app-*.log.gz" />

          <IfLastModified age="60d" />

        </Delete>

      </DefaultRolloverStrategy>

    </RollingFile>

  </Appenders>

  <Loggers>

    <Root level="error">

      <AppenderRef ref="RollingFile"/>

    </Root>

  </Loggers>

</Configuration>

上述配置文件中,Delete部分便是配置DeleteAction的删除策略,指定了当触发rollover时,删除baseDir文件夹或其子文件下面的文件名符合app-*.log.gz且距离最后的修改日期超过60天的文件。

其中,basePath指定了扫描开始路径,为baseDir文件夹。maxDepth指定了目录扫描深度,为2表示扫描baseDir文件夹及其子文件夹。

IfFileName指定了文件名需满足的条件,IfLastModified指定了文件修改时间需要满足的条件。

DeleteAction常用参数如下:


参数名

类型

描述
basePath String
必填。目录扫描开始路径。

maxDepth int
扫描的最大目录深度。0表示basePath指定的文件自身。Integer.MAX_VALUE表示扫描所有的目录层。默认值为1,表示仅扫描basePath下的文件。

testMode boolean
如果为true,实际的文件不会被删除,删除文件的信息会打印到log4j2的INFO级别的log中。可使用此参数测试配置是否符合预测。默认为false。

pathConditions PathCondition[]
删除文件的过滤条件,满足指定条件的文件将会被删除,可以指定一个或多个。

如果指定多个pathCondition,需要同时满足。Conditions可以嵌套,当嵌套配置时,只有当满足了外部的contion时,才能对内部的condition进行判断。如果Conditions不是嵌套的,会可能以任意顺序进行判断。

Conditions也可以通过使用IfAll,IfAny,IfNot等类似于AND,OR,NOT的condition,实现复杂的condition。

  • IfFileName-判断文件的文件名是否满足正则表达式或glob表达式
  • IfLastModified-判断文件的修改时间是否早于指定的duration
  • IfAccumulatedFileCount-判断在遍历文件树的时候,文件个数是否超过了指定值
  • IfAccumulatedFileSize-判断在遍历文件树的时候,文件的总大小是否超过了指定值
  • IfAll-判断嵌套的condition是否都满足
  • IfAny-判断嵌套的condition是否有一个满足
  • IfNot-判断嵌套的condition是否不满足

五、程序测试demo

public class HelloWorld {

    public static void main(String[] args) {

        Logger logger = LogManager.getLogger(LogManager.ROOT_LOGGER_NAME);

        try{

            //通过打印i,日志文件中数字越小代表越老

            for(int i = 0; i < 50000; i++) {

                logger.info("{}", i);

                logger.info("logger.info\n");

                Thread.sleep(100);//为了防止50000条很快跑完,sleep一段时间

            }

        catch (InterruptedException e) {}

    }

}

1.测试基于时间触发

filePattern最小时间粒度为秒,将每5秒触发一次rollover

<?xml version="1.0" encoding="UTF-8"?>

<Configuration status="trace" name="MyApp" packages="">

    <Appenders>

        <Console name="Console" target="SYSTEM_OUT">

            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />

        </Console>

        <!--<RollingFile name="RollingFile" fileName="logs/app.log"-->

                     <!--filePattern="logs/app-%d{yyyy-MM-dd HH}-%i.log">-->

        <RollingFile name="RollingFile" fileName="logs/app.log"

                     filePattern="logs/app-%d{yyyy-MM-dd HH-mm-ss}.log">

            <PatternLayout>

                <Pattern>%d %p %c{1.} [%t] %m%n</Pattern>

            </PatternLayout>

            <Policies>

                <!--当经过了interval时间后,将根据filePattern对文件进行重命名,并生成新的文件用于日志写入-->

                <TimeBasedTriggeringPolicy interval="5"/>

                <!--当日志文件大小大于size时,将根据filepattern对文件进行重命名,并生成新的文件用于日志写入-->

                <!--<SizeBasedTriggeringPolicy size="30KB"/>-->

            </Policies>

            <DefaultRolloverStrategy max="3"/>

        </RollingFile>

    </Appenders>

    <Loggers>

        <Root level="trace">

            <AppenderRef ref="Console"/>

            <AppenderRef ref="RollingFile"/>

        </Root>

    </Loggers>

</Configuration>

2.测试基于文件大小的触发

日志文件达到5KB,将触发rollover

<?xml version="1.0" encoding="UTF-8"?>

<Configuration status="trace" name="MyApp" packages="">

    <Appenders>

        <Console name="Console" target="SYSTEM_OUT">

            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />

        </Console>

        <!--<RollingFile name="RollingFile" fileName="logs/app.log"-->

                     <!--filePattern="logs/app-%d{yyyy-MM-dd HH}-%i.log">-->

        <RollingFile name="RollingFile" fileName="logs/app.log"

                     filePattern="logs/app-%d{yyyy-MM-dd HH-mm-ss}.log">

            <PatternLayout>

                <Pattern>%d %p %c{1.} [%t] %m%n</Pattern>

            </PatternLayout>

            <Policies>

                <!--当经过了interval时间后,将根据filePattern对文件进行重命名,并生成新的文件用于日志写入-->

                <!--<TimeBasedTriggeringPolicy interval="5"/>-->

                <!--当日志文件大小大于size时,将根据filepattern对文件进行重命名,并生成新的文件用于日志写入-->

                <SizeBasedTriggeringPolicy size="5KB"/>

            </Policies>

            <DefaultRolloverStrategy max="3"/>

        </RollingFile>

    </Appenders>

    <Loggers>

        <Root level="trace">

            <AppenderRef ref="Console"/>

            <AppenderRef ref="RollingFile"/>

        </Root>

    </Loggers>

</Configuration>

3.测试DefaultRolloverStrategy的max参数和%i计数器的搭配使用

注意filePattern最小时间粒度为分钟,且含%i计数器

<?xml version="1.0" encoding="UTF-8"?>

<Configuration status="trace" name="MyApp" packages="">

    <Appenders>

        <Console name="Console" target="SYSTEM_OUT">

            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />

        </Console>

        <RollingFile name="RollingFile" fileName="logs/app.log"

                     filePattern="logs/app-%d{yyyy-MM-dd HH-mm}-%i.log">

        <!--<RollingFile name="RollingFile" fileName="logs/app.log"-->

                     <!--filePattern="logs/app-%d{yyyy-MM-dd HH-mm-ss}.log">-->

            <PatternLayout>

                <Pattern>%d %p %c{1.} [%t] %m%n</Pattern>

            </PatternLayout>

            <Policies>

                <!--当经过了interval时间后,将根据filePattern对文件进行重命名,并生成新的文件用于日志写入-->

                <!--<TimeBasedTriggeringPolicy interval="5"/>-->

                <!--当日志文件大小大于size时,将根据filepattern对文件进行重命名,并生成新的文件用于日志写入-->

                <SizeBasedTriggeringPolicy size="5KB"/>

            </Policies>

            <DefaultRolloverStrategy max="3"/>

        </RollingFile>

    </Appenders>

    <Loggers>

        <Root level="trace">

            <AppenderRef ref="Console"/>

            <AppenderRef ref="RollingFile"/>

        </Root>

    </Loggers>

</Configuration>

六、参考资料

http://logging.apache.org/log4j/2.x/manual/appenders.html  RollingFileAppender部分

时间: 2024-10-29 19:06:01

Log4j2中RollingFile的文件滚动更新机制的相关文章

百度搜索引擎中的快照及快照更新机制

百度搜索引擎中的快照及快照更新机制 1.什么是百度快照? 如果无法打开某个搜索结果,或者打开速度特别慢,该怎么办?“百度快照”能帮您解决问题.每个被收录的网页,在百度上都存有一个纯文本的备份,称为“百度快照”.百度速度较快,您可以通过“快照”快速浏览页面内容. 不过,百度只保留文本内容,所以,那些图片.音乐等非文本信息,快照页面还是直接从原网页调用.如果您无法连接原网页,那么快照上的图片等非文本内容,会无法显示.所以,针对一些关闭掉或者无法访问的网站,如果想看到部分内容是可以通过百度快照实现的哦

Log4j2中的同步日志与异步日志

1.背景 Log4j 2中记录日志的方式有同步日志和异步日志两种方式,其中异步日志又可分为使用AsyncAppender和使用AsyncLogger两种方式. 2.Log4j2中的同步日志 所谓同步日志,即当输出日志时,必须等待日志输出语句执行完毕后,才能执行后面的业务逻辑语句. 下面通过一个例子来了解Log4j2中的同步日志,并借此来探究整个日志输出过程. log4j2.xml配置如下: <?xml version="1.0" encoding="UTF-8"

Kubernetes集群中Service的滚动更新

Kubernetes集群中Service的滚动更新 二月 9, 2017 0 条评论 在移动互联网时代,消费者的消费行为已经"全天候化",为此,商家的业务系统也要保持7×24小时不间断地提供服务以满足消费者的需求.很难想像如今还会有以"中断业务"为前提的服务系统更新升级.如果微信官方发布公告说:每周六晚23:00~次日凌晨2:00进行例行系统升级,不能提供服务,作为用户的你会怎么想.怎么做呢?因此,各个平台在最初设计时就要考虑到服务的更新升级问题,部署在Kubern

【Flume】flume中sink到hdfs,文件系统频繁产生文件,文件滚动配置不起作用?

本人在测试hdfs的sink,发现sink端的文件滚动配置项起不到任何作用,配置如下: a1.sinks.k1.type=hdfs a1.sinks.k1.channel=c1 a1.sinks.k1.hdfs.useLocalTimeStamp=true a1.sinks.k1.hdfs.path=hdfs://192.168.11.177:9000/flume/events/%Y/%m/%d/%H/%M a1.sinks.k1.hdfs.filePrefix=XXX a1.sinks.k1.

简单实用的启动脚本文件(更新中)

原来工作遇到的脚本,记下来几个,感觉很有用: 1 # Some shotcuts of the shells 2 # .startsh 3 # 4 # User specific aliases and functions 5 # 6 alias ..='cd ..' 7 alias ...='cd ../..' 8 alias cls=clear 9 alias ll='ls -al' 10 alias grep='grep -n' 11 alias net='netstat -n|grep'

【Flume】【源码分析】flume中sink到hdfs,文件系统频繁产生文件,文件滚动配置不起作用? ERROR hdfs.BucketWriter: Hit max consecutive under-replication rotations (30)

[转载] http://blog.csdn.net/simonchi/article/details/43231891 ERROR hdfs.BucketWriter: Hit max consecutive under-replication rotations (30) 本人在测试hdfs的sink,发现sink端的文件滚动配置项起不到任何作用,配置如下: [plain] view plain copy print? a1.sinks.k1.type=hdfs a1.sinks.k1.cha

docker swarm ,滚动更新

一.Docker swarm Swarm 是 Docker 公司在 2014 年 12 月初发布的一套较为简单的工具,用来管理 Docker 集群,它将一群 Docker 宿主机变成一个单一的,虚拟的主机.Swarm 使用标准的 Docker API接口作为其前端访问入口,换言之,各种形式的 Docker Client(docker client in go, docker_py,docker 等)均可以直接与 Swarm 通信.Swarm 几乎全部用 Go 语言来完成开发.Swarm deam

NSObject头文件解析 / 消息机制 / Runtime解读 (二)

本章接着NSObject头文件解析 / 消息机制 / Runtime解读(一)写 给类添加属性: BOOL class_addProperty(Class cls, const char *name, const objc_property_attribute_t *attributes, unsigned int attributeCount) 其中有一个参数我们再在上一篇中提到过 typedef struct { const char *name;           /**< The na

Linux 内核的文件 Cache 管理机制介绍

Linux 内核的文件 Cache 管理机制介绍 文件 Cache 管理是 Linux 内核中一个很重要并且较难理解的组成部分.本文详细介绍了 Linux 内核中文件 Cache 管理的各个方面,希望能够对开发者理解相关代码有所帮助. http://www.ibm.com/developerworks/cn/linux/l-cache/ http://www.cnblogs.com/MYSQLZOUQI/p/4857437.html 1 前言 自从诞生以来,Linux 就被不断完善和普及,目前它