【党校管理源码】【健康档案系统源码】【php主机网源码】源码streammanager

时间:2024-11-19 10:46:51 编辑:会所论坛源码 来源:c语言api源码

1.Log4j Appender之RollingFileAppender

源码streammanager

Log4j Appender之RollingFileAppender

       æœ¬æ–‡ç¿»è¯‘自log4j官方文档(有些细节属于个人理解): https://logging.apache.org/log4j/2.x/manual/appenders.html#RollingFileAppender

        RollingFileAppender是一种OutputStreamAppender,该appender会将日志写入名称为配置项fileName的文件中,并且还会根据TriggeringPolicy和RolloverPolicy对日志文件进行回滚操作,它依赖RollingFileManager(继承自OutputStreamManager)来实际执行文件读写(I/O)和回滚。尽管通过不同配置初始化的RollingFileAppender不能共享,但是RollingFileManagers却是可以共享的。比如,在同一个servlet容器中的两个web应用,虽然各自有他们自己的配置,但是如果log4j是通过公用的ClassLoader 加载的话,就可以同时写入到同一个日志文件。

        RollingFileAppender依赖于一个 TriggeringPolicy 和一个 RolloverStrategy ,triggering policy决定了是否执行回滚,而RolloverStrategy决定了如何进行回滚。如果没有配置RolloverStrategy,就会使用 DefaultRolloverStrategy 。从log4j 2.5版本开始,可以在DefaultRolloverStrategy中配置一个 custom delete action ,以便在回滚时完成自定义的删除操作。从log4j 2.8版本开始,如果没有配置file name,则会默认使用 DirectWriteRolloverStrategy ,而不是DefaultRolloverStrategy。从log4j 2.9版本开始,可以在DefaultRolloverStrategy中配置一个 custom POSIX file attribute view action ,如果没有定义,则会使用继承自RollingFileAppender的POSIX file。

        RollingFileAppender不支持日志文件锁定。

       CompositeTriggeringPolicy用于组合多个triggering policies,如果有一个返回true,则CompositeTriggeringPolicy就返回true。

        如下的xml片段,组合了三个triggering policies:1.当JVM启动时;2.当日志文件达到MB时;3.当前日期与日志文件的起始日期不匹配时(按天分文件);

        基于cron表达式进行回滚。这个策略通过一个timer来控制,并且是异步去处理log event的,因此可能会出现来自上一个或下一个时间段的日志出现在下一个日志文件的开头或结尾。配置项filePattern中需要包含一个timestamp,否则在每次回滚的时候,目标文件都会被覆盖。

       å¦‚果文件的创建时间小于JVM启动的时间,并且日志文件的大小大约等于了最小文件大小,则会在JVM启动时触发回滚。

       æ³¨æ„ï¼šGoogle App Engine

        当应用运行于Google App Engine中时,源码党校管理源码 该策略只能使用Log4J的初始时间来做判断依据。 (Google App Engine限制了访问具体class,所以Log4J不能通过方法java.lang.management.ManagementFactory.getRuntimeMXBean().getStartTime() 获取到JVM的启动时间,只能降级为使用Log4J的初始时间。)

        当文件大小达到指定值时,SizeBasedTriggeringPolicy会触发回滚。大小可以指定不同的单位,包括:默认的bytes、包含后缀的 KB, MB or GB,比如:表示个字节,MB表示兆比。当与时间类型的策略组合使用时,filePattern参数必须包含%i,不然文件将会被覆盖,因为SizeBased Triggering Policy不会变更文件名中的时间参数。当不与时间类型的回滚策略组合使用时,SizeBased Triggering Policy会变更文件名中的时间参数。

        当当前时间(date/time)规则不再与当前文件名中的date/time一致时,TimeBasedTriggeringPolicy会触发回滚。该策略接受一个interval属性,用于指定基于time和modulate的回滚频率。

       é»˜è®¤çš„回滚策略支持RollingFileAppender的属性filePattern中配置的date/time规则以及一个数字计数器。filePattern中的date/time规则会被设置为当前时间,而计数器会在每次回滚时递增。如果同时包含date/time和计数器,则计数器会在date/time规则的值发生变更时重新开始计数。如果filePattern以".gz", ".zip", ".bz2", ".deflate", ".pack", or ".xz" 结尾,回滚后的文件就会以对应的格式进行压缩。使用bzip2, Deflate, Pack and XZ需要引入 Apache Commons Compress 库,并且XZ还需要多引入 XZ for Java 。The pattern may also contain lookup references that can be resolved at runtime such as is shown in the example below.

        默认的回滚策略支持三种形式的计数器,为了表述清楚它是怎么工作的,我们假设计数器最小值为1,最大值为3,文件名称为foo.log,filePattern为foo-%i.log。

        为了对照配置项fileIndex设置为"min"时的效果,基于上表的假设,会出现如下现象。

        最后,在2.8版本中,如果fileIndex 设置为了"nomax",这时就会忽略配置项max和min。所以每一次回滚时都会递增计数器,不再有最大回滚文件数量的限制。

       DirectWriteRolloverStrategy会将日志直接输出到filePattern指定的文件,这个规则在回滚时不会重命名文件。如果在时间回滚策略未生效的过程中,基于大小的策略产生了多次回滚,回滚文件名会自动添加计数器(但文件中的时间不变),并不断增长,直到基于时间的回滚策略生效,又会重新开始新一轮的计数器增长。

        注意:如果filePattern中指定需要压缩的规则(比如zip后缀名),当前写入文件不会被压缩,除非程序关闭。另外,如果按照时间规则进行了回滚,新的写入文件同样不会被压缩。

       ä¸‹æ–¹æ˜¯ä¸€ä¸ªå³ä½¿ç”¨æ—¶é—´è§¦å‘策略又使用大小触发策略的事例,它每天将创建最多7个回滚文件,回滚文件将会被保存在名称为年和月的目录中,每个回滚文件将会使用gzip格式进行压缩:

        第二个事例,指定最大的回滚文件数量,当大于个回滚文件时,就会被移除:

        下面的事例,同样是一个即使用时间触发策略又使用大小触发策略的事例。同样,每天最多只会保留7个回滚文件,回滚文件放在以当前年和月为名称的目录中,也将会使用gzip进行压缩。特殊的是,本次我们就要求文件6小时回滚一次,并且回滚需要发生在能被6整除的小时。

        下方的事例使用cron和大小触发策略,回滚文件没有数量限制。cron策略会在每个小时0分触发回滚,同时大小回滚策略会在文件等于MB时触发回滚:

        下方的事例与上一个类似,只是限制了每小时回滚文件的数量为个:

        Log4j-2.5为了弥补DefaultRolloverStrategy只能根据max来删除文件的策略,而引入了Delete action,用户就可以有更多的在回滚时删除文件的手段。Delete action让用户可以配置一个或者多个条件来选择需要删除的文件。

        需要注意的是,Delete action可能会删除符合条件的任何文件,不仅仅是回滚文件,所以使用这个特性时需要当心。你可以使用testMode参数来测试你的配置,以防意外的删错了文件。

       ä¸‹æ–¹çš„事例,使用一个cron触发策略,每天午夜触发回滚。回滚文件存放在当前年和月的目录中。所有在base path目录下的满足表达式" /app- .log.gz"的文件,且最后修改时间大于等于天的文件将会在回滚时被删除。

        下方的事例,使用时间和大小的触发策略。该策略会在以当前年和月的目录中保存一天最多个回滚文件,每个回滚文件将使用gzip进行压缩,每个小时会回滚一次。在每次回滚时,删除文件的判断条件为:文件名满足表达式" /app- .log.gz",并且最后修改时间大于等于天,但是不会删除最近GB文件(总大小大于GB)或者最近的个(文件数大于)文件。

       ä¸‹æ–¹äº‹ä¾‹ï¼Œä½¿ç”¨cron触发策略,每天的午夜将会触发回滚。回滚文件存放在以当前年和月为名称的目录中。该脚本返回base path目录下的日期为日(星期五)的回滚文件列表。Delete action将会删除该脚本返回的所有文件。

        Log4j-2.9引入了PosixViewAttribute action,该action给予用户更多控制回滚文件的对于owner和group的权限。该action孕育用户配置一个或者多个条件来选择符合条件的base path中的文件。

       ä¸‹é¢æ˜¯ä¸€ä¸ªä½¿ç”¨RollingFileAppender的示例配置,它为当前和已滚日志文件定义了不同的POSIX文件属性视图。