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。
|
五、程序测试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部分
Log4j2中RollingFile的文件滚动更新机制的更多相关文章
- Log4j2中的同步日志与异步日志
1.背景 Log4j 2中记录日志的方式有同步日志和异步日志两种方式,其中异步日志又可分为使用AsyncAppender和使用AsyncLogger两种方式. 2.Log4j2中的同步日志 所谓同步日 ...
- kubernetes之DaemonSet以及滚动更新
1.什么是DaemonSet? 1.1DaemonSet是Pod控制器的又一种实现方式,用于在集群中的全部节点上同时运行一份指定的Pod资源副本,后续加入集群的节点也会自动创建一个相关的Pod对象,当 ...
- Deployment之滚动更新策略。
1.Deployment控制器详细信息中包含了其更新策略的相关配置.kubectl describe命令中输出的StrategyType.RollingUpdateStrategy字段等: root@ ...
- Kubernetes集群中Service的滚动更新
Kubernetes集群中Service的滚动更新 二月 9, 2017 0 条评论 在移动互联网时代,消费者的消费行为已经“全天候化”,为此,商家的业务系统也要保持7×24小时不间断地提供服务以满足 ...
- 入门 - k8s滚动更新部署中的镜像版本 (七)
目标 使用 kubectl 执行 Rolling Update(滚动更新) 更新应用程序 用户期望应用程序始终可用,为此开发者/运维者在更新应用程序时要分多次完成.在 Kubernetes 中,这是通 ...
- flume中sink到hdfs,文件系统频繁产生文件,文件滚动配置不起作用?
在测试hdfs的sink,发现sink端的文件滚动配置项起不到任何作用,配置如下: a1.sinks.k1.type=hdfs a1.sinks.k1.channel=c1 a1.sinks.k1.h ...
- HTML 5 应用程序缓存(Application Cache)cache manifest 文件使用 html5 中创建manifest缓存以及更新方法 一个manifest文件会创建一份缓存,不同的manifest文件其缓存的内容是互不干扰的
HTML5 离线缓存-manifest简介 HTML 5 应用程序缓存 使用 HTML5,通过创建 cache manifest 文件,可以轻松地创建 web 应用的离线版本. 什么是应用程序缓存(A ...
- Linux 内核的文件 Cache 管理机制介绍
Linux 内核的文件 Cache 管理机制介绍 http://www.ibm.com/developerworks/cn/linux/l-cache/ 1 前言 自从诞生以来,Linux 就被不断完 ...
- Expo大作战(十五)--expo中splash启动页的详细机制
简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...
随机推荐
- rails中link_to与button_to的一个功能差异
页面中本来设计一个按钮,功能是当按下时跳转到index方法,然后实现一段功能.关键是其中需要传递一个参数show_all,其值为true. index方法中通过判断是否含有该参数来实现不同的逻辑,类似 ...
- 使用bootstrap table 插件固定表头时 表头与表格内容无法对齐
在使用bootstrap table开发后台管理系统,表格利用bootstrap-table插件来实现,使用bootstrap-table过程中,会出现表头错位的情况 表头对不齐效果: 解决的方法: ...
- InnoDB存储引擎的总览
InnoDB存储引擎由Innobase Oy公司开发,后被Oracle收购.从MySQL5.5版本开始是默认的存储引擎. InnoDB支持ACID事务.提供行锁设计,支持MVCC.外键,一致性非锁定读 ...
- win10 下安装mysql服务器社区版本mysql-5.7.22-winx64
下载 下载: http://dev.mysql.com/downloads/mysql/ 解压到C盘 添加环境变量path 添加环境变量 右击我的电脑->属性->高级系统设置->高级 ...
- 自动生成MyEclipse 安装破解码
新建一个class 文件,Debug 模式运行一个,输入任意值 ,回车得到破解安装码 代码文件如下: import java.io.*; public class MyEclipseGen { pri ...
- 各种代码版本控制工具下使用http代理的方法
原文:各种SCM工具下使用http代理下载源码:http://www.linuxeden.com/html/develop/20090723/66951.html SCM是软件配置管理的简称,常见的S ...
- 中国的UED们
UED网址导航:http://www.ux265.com/ 天猫UED:http://ued.tmall.com/ 一淘UED:http://ux.etao.com/ 淘宝UED:http://ued ...
- leetCode刷题(找到两个数组拼接后的中间数)
There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two ...
- 第三章 C++的三种基本控制结构
0x C++提供的三种基本控制结构 顺序结构:按照先后顺序依次执行程序中的语句 选择结构:按照给定条件有选择地执行程序中的语句 循环语句:按照给定规则重复地执行程序中的语句 1x 第一节 C++语句 ...
- jieba库词频统计练习
在sypder上运行jieba库的代码: import matplotlib.pyplot as pltfracs = [2,2,1,1,1]labels = 'houqin', 'jiemian', ...