共计 10357 个字符,预计需要花费 26 分钟才能阅读完成。
<?xml version="1.0" encoding="UTF-8"?>
<!-- 日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--Configuration 前面的 status,这个用于设置 log4j2 本身外部的信息输入,能够不设置,当设置成 trace 时,你会看到 log4j2 外部各种具体输入 -->
<!--monitorInterval:Log4j 可能自动检测批改配置 文件和重新配置自身,可设置一个非零的距离秒数来检测配置变更 -->
<Configuration status="WARN" monitorInterval="60">
<!-- 自定义一些变量 -->
<Properties>
<!-- 变量定义 -->
<Property name="log_base_dir">/app_data/logs/my_app</Property>
<!-- Appender 在将日志数据写入指标地位之前,个别会将日志数据通过 Layout 进行格式化。PatternLayout 能够应用与 C 语言 printf 函数相似
的转换模式来指定输入格局。常见的配置如下:- %d{yyyy-MM-dd HH:mm:ss.SSS} : 日志生成工夫,输入格局为“年 - 月 - 日 时: 分: 秒. 毫秒”- %p : 日志输入格局
- %c : logger 的名称
- %m : 日志内容,即 logger.info("message")
- %n : 换行符
- %T : 线程号
- %L : 日志输入所在行数
- %M : 日志输入所在办法名 -->
<Property name="log_pattern">[%d{yyyy-MM-dd HH:mm:ss.SSS}][%-5p][%T][%c.%M:%L] %msg%xEx%n</Property>
<!-- 单个日志文件最大大小,单位能够是 KB, MB or GB -->
<Property name="max_single_file_size">1MB</Property>
</Properties>
<!-- 应用 Appenders 元素能够将日志事件数据写到各种指标地位(目前能够为控制台、文件、多种数据库 API、近程套接字服务器、Apache Flume、JMS、近程 UNIX Syslog daemon),其内的每个 Appender 都必须要有一个 name 属性作为惟一标识,该标识的值在 Logger 中通过 AppenderRef 来引
用,从而将该 Appender 配置到该 Logger 中 -->
<Appenders>
<!-- Console Appender 罕用于将日志输入到 System.out,个别用在开发环境 -->
<Console name="Console" target="SYSTEM_OUT">
<!-- 只承受程序中 DEBUG 级别的日志进行解决 -->
<ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>
<!-- 在大多数状况下,Appender 将格式化 LogEvent 的责任委托给 Layout -->
<PatternLayout pattern="${log_pattern}"/>
</Console>
<!-- RollingFile Appender 会将日志输入到 fileName 属性指定的文件中,且须要指定 TriggeringPolicy 和 RolloverStrategy。其中
TriggeringPolicy 决定是否生成新的日志文件,RolloverStrategy 决定如何生成新的日志文件。如果没有配置 RolloverStrategy,则会
应用 DefaultRolloverStrategy。从 2.5 开始,能够在 DefaultRolloverStrategy 中配置一个自定义的删除动作。从 2.8 开始,如果没有指定
文件名,则会应用 DirectWriteRolloverStrategy 来代替 DefaultRolloverStrategy -->
<!-- 这个 RollingFile Appender 会打印出所有的 DEBUG 及以下级别(DEBUG、INFO、ERROR、FATAL、OFF)的信息 -->
<RollingFile name="DebugLogRollingFile" fileName="${log_base_dir}/my_app_debug.log"
filePattern="${log_base_dir}/$${date:yyyy_MM_dd}/my_app_debug_%d{yyyy_MM_dd_HH}_%i.log.gz">
<ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="${log_pattern}" charset="UTF-8"/>
<!-- Policies 示意一个 CompositeTriggeringPolicy,能够组合多个 TriggeringPolicy,只有外部的任意一个 TriggeringPolicy
满足触发条件,都会滚动日志 -->
<Policies>
<!-- TimeBasedTriggeringPolicy 用于按工夫滚动日志。只有 filePattern 属性值中的日期 / 工夫模式(pattern)不再利用于当
前文件时就进行日志滚动。这种规定通过 interval 和 modulate 属性来配置。interval 属性指定一个整数,用于基于日期 / 工夫模式中
的最小的工夫单位数滚动一次。例如,filePattern 值为 /app_data/logs/my_app/$${date:yyyy_MM_dd}/my_app_%d{yyyy_
MM_dd_HH}_%i.log,这里应用小时作为最小的工夫单位时,如果 interval 参数值为 4,则示意每 4 小时滚动一次。默认值为 1。modulate 示意是否调整 interval 属性值以便下次滚动产生在 interval 边界处。如果工夫最小单位为小时,以后工夫为早上 3 点,距离
为 4 小时,则第一次滚动将产生在早上 4 点时(而不是早上 7 点),后续滚动将产生在早上 8 点、中午 12 点、下午 4 点等时刻 -->
<TimeBasedTriggeringPolicy interval="1" modulate="false"/>
<!-- SizeBasedTriggeringPolicy 用于按文件大小滚动日志。每当日志文件超过 size 指定的大小(个别不超过几十 MB,否则应用软
件关上导出的日志时很不不便),则这 size 大小的日志会主动存入按 filePattern 属性指定建设的文件夹上面并进行压缩存档 -->
<SizeBasedTriggeringPolicy size="${max_single_file_size}"/>
</Policies>
<!-- DefaultRolloverStrategy 能够同时承受 RollingFileAppender 中 filePattern 属性值中日期 / 工夫和整数计数器(%i)的
pattern,当日期 / 工夫满足条件时,则会应用以后的日期 / 工夫生成新的日志文件,如果 filePattern 属性值中含有一个整数计数器 %i,则
在每次滚动时该整数都会减少,如果 filePattern 属性值中同时蕴含了日期 / 工夫和整数计数器(%i),计数器会在日期 / 工夫不变时而满足
其余滚动触发条件时(文件大小)开始自增,直到日期 / 工夫发生变化时,计数器会从新自增。以.gz、.zip、.bz2、deflate、pack200
或 xz 结尾的 filePattern 值,会在日志文件归档时当前缀对应的格局进行压缩。min 属性指定计数器的最小值,默认为 1。max 属性指定计数
器的最大值,一旦计数器达到了最大值,最早的归档将会在每次滚动时被删除,默认值为 7。fileIndex 属性如果设置为 max(默认),则具
有更大索引的文件比具备更小索引的文件内容更新,如果设置为 min,文件将重命名且计数器将遵循 Fixed Window 策略,这两种状况均有可
能导致批量的文件重命名,自 2.8 版本开始,如果 fileIndex 属性设置为 nomax,则 min 和 max 属性值都将会被疏忽,文件编号将每次递增 1,每次滚动都会递增到更大的值,且没有最大文件编号的限度 -->
<!--<DefaultRolloverStrategy max="100" min="1" fileIndex = "nomax"/>-->
<DefaultRolloverStrategy fileIndex="nomax">
<!-- Log4j 2.5 引入了删除动作(Delete 元素)。在滚动删除旧的日志文件时,相比应用 DefaultRolloverStrategy 的 max 属
性,该性能能够让用户领有更多的删除管制。删除动作能够让用户配置若干个条件来删除绝对于基准目录的文件。该性能能够删除非日
志文件,应用时肯定要小心。能够通过 testMode 属性来测试配置是否会错删文件。basePath 属性值用于指定删除文件的基准目录,必
须显式指定。maxDepth 属性指定扫描目录的最大层级,0 示意仅能拜访基准目录(平安限度不能拜访的状况除外),Integer.MAX_VALUE 值示意能够拜访所有层级。默认值为 1,示意仅扫描基准目录下的文件。testMode 属性值如果设置为 true,文件
不会理论删除,而是在 status logger 打印一条 INFO 级别的音讯,能够应用该性能来测试是否会错删指标文件,默认为 false。-->
<!-- 这里的 Delete 元素配置了每次滚动都会删除基准目录下匹配“*/my_app_debug_*.log.gz”日志文件,只有 9 分钟以前的日志文
件总大小超过 2MB,或 9 分钟以前的日志文件文件总数超过 2 个就按工夫程序删除较早的日志文件。该元素能够避免日志文件所在分区的
磁盘空间被占满。特地须要留神的是,只有在产生日志滚动时才会尝试进行删除,否则即便满足了删除条件,但如果没有新的滚动日志
生成的话也不会产生删除操作。-->
<Delete basePath="${log_base_dir}" maxDepth="2">
<!-- Delete 元素里能够指定若干个 PathCondition 类型的元素。如果指定了不止一个条件,则这些条件都须要在删除之前承受
某个门路。这些条件能够嵌套,只有内部条件承受某个门路之后,其外部条件才会决定是否承受该门路。如果这些条件没有嵌套,则它们的执行程序是任意的。这些条件也能够通过应用 IfAll, IfAny 和 IfNot 等组合条件进行 AND、OR 和 NOT 等逻辑运算。用户
也能够创立自定义条件或应用内置条件:- IfFileName:承受匹配正则表达式或 glob 的文件门路;- IfLastModified:承受比指定时段早或一样早的文件;- IfAccumulatedFileCount:在遍历文件树时文件总数超过文件数下限后承受门路;- IfAccumulatedFileSize:在遍历文件树时文件总大小超过下限后承受门路;- IfAll:如果所有内嵌条件都承受了某个门路才会承受该门路,相当于 AND 逻辑,其内嵌条件的执行程序是任意的;- IfAny:如果任意一个内嵌条件承受了某个目录就承受该目录,相当于 OR 逻辑,其内嵌条件的执行程序是任意的;- IfNot:如果内嵌条件不承受某个门路就接管该门路,相当于 NOT 逻辑。-->
<!-- IfFileName 能够通过 glob(应用受限的模式语言, 比正则更简略)或 regex 属性(正则)来匹配相对路径(绝对于 Delete
的 basePath 属性指定的基准目录)-->
<!-- 当内部的条件满足时才会计算外部的条件,外部的同级条件的计算程序是任意的。-->
<IfFileName glob="*/my_app_debug_*.log.gz">
<!-- IfLastModified 能够通过 age 属性值来指定承受最初批改工夫为指定工夫或早于指定工夫的门路,该属性的值可参考
org.apache.logging.log4j.core.appender.rolling.action.Duration.parse(CharSequence text) 办法的文档 -->
<!-- 这里的 IfLastModified 指定删除达到或超过 60 天内的文件 -->
<IfLastModified age="9m">
<!-- 这里的 IfAny 内嵌了两个 PathCondition,示意满足任意一个条件即可 -->
<IfAny>
<!-- IfAccumulatedFileSize 可通过 exceeds 属性值指定一个文件总大小上限值。如果文件数超过了该上限值
则删除文件 -->
<IfAccumulatedFileSize exceeds="2MB"/>
<!-- IfAccumulatedFileCount 可通过 exceeds 属性值指定一个文件总数上限值。如果文件数超过了该上限值
则删除文件 -->
<IfAccumulatedFileCount exceeds="2"/>
</IfAny>
</IfLastModified>
</IfFileName>
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
<RollingFile name="InfoLogRollingFile" fileName="${log_base_dir}/my_app_info.log"
filePattern="${log_base_dir}/$${date:yyyy_MM_dd}/my_app_info_%d{yyyy_MM_dd_HH}_%i.log.gz">
<ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="${log_pattern}"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="${max_single_file_size}"/>
</Policies>
<DefaultRolloverStrategy fileIndex="nomax">
<Delete basePath="${log_base_dir}" maxDepth="2">
<IfFileName glob="*/my_app_info_*.log.gz">
<!-- 这里示意匹配“*/my_app_info_*.log.gz”模式的日志文件的删除策略如下:- 只有日志文件总数量超过 5 个就删除按工夫程序最早的日志文件
- 只有日志文件总大小超过 10MB 就会删除按工夫程序最早的日志文件
- 只有日志文件最近批改工夫为 9 分钟前或更早就会删除按工夫程序最早的日志文件 -->
<IfAny>
<IfAccumulatedFileSize exceeds="8MB"/>
<IfAccumulatedFileCount exceeds="5"/>
<IfLastModified age="9m"/>
</IfAny>
</IfFileName>
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
<RollingFile name="WarnLogRollingFile" fileName="${log_base_dir}/my_app_warn.log"
filePattern="${log_base_dir}/$${date:yyyy_MM_dd}/my_app_warn_%d{yyyy_MM_dd_HH}_%i.log.gz">
<ThresholdFilter level="WARN" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="${log_pattern}"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="${max_single_file_size}"/>
</Policies>
<DefaultRolloverStrategy fileIndex="nomax">
<Delete basePath="${log_base_dir}" maxDepth="2">
<IfFileName glob="*/my_app_warn_*.log.gz">
<IfAny>
<IfAccumulatedFileSize exceeds="3GB"/>
<IfAccumulatedFileCount exceeds="3000"/>
<IfLastModified age="30d"/>
</IfAny>
</IfFileName>
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
<RollingFile name="ErrorLogRollingFile" fileName="${log_base_dir}/my_app_error.log"
filePattern="${log_base_dir}/$${date:yyyy_MM_dd}/my_app_error_%d{yyyy_MM_dd_HH}_%i.log.gz">
<ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="${log_pattern}"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="${max_single_file_size}"/>
</Policies>
<DefaultRolloverStrategy fileIndex="nomax">
<Delete basePath="${log_base_dir}" maxDepth="2">
<IfFileName glob="*/my_app_error_*.log.gz">
<IfAny>
<IfAccumulatedFileSize exceeds="3GB"/>
<IfAccumulatedFileCount exceeds="3000"/>
<IfLastModified age="30d"/>
</IfAny>
</IfFileName>
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
<!-- 记录 druid 的 SQL 语句 -->
<RollingFile name="DruidSqlRollingFile" fileName="${log_base_dir}/druid.log"
filePattern="${log_base_dir}/$${date:yyyy_MM_dd}/druid_%d{yyyy_MM_dd_HH}_%i.log.gz">
<PatternLayout pattern="${log_pattern}"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="${max_single_file_size}"/>
</Policies>
<DefaultRolloverStrategy fileIndex="nomax">
<Delete basePath="${log_base_dir}" maxDepth="2" testMode="true">
<IfFileName glob="*/druid_*.log.gz">
<IfAny>
<IfAccumulatedFileSize exceeds="3GB"/>
<IfAccumulatedFileCount exceeds="3000"/>
<IfLastModified age="30d"/>
</IfAny>
</IfFileName>
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
</Appenders>
<!-- 定义 logger,只有定义了 logger 并引入的 appender,appender 才会失效 -->
<Loggers>
<!-- 当 Logger 在配置文件中申明时,就创立了一个 LoggerConfig 对象,两者一一对应,LoggerConfig 蕴含一些 Filter、这些
Filters 用于过滤传递给任意 Appender 的 LogEvent,它还蕴含一些 Appender 的援用。Logger 自身执行无指向的动作,它仅含有一
个与 LoggerConfig 关联的名称(通过 name 属性指定),root Logger 具备固定的默认名称,其余 Logger 须要指定各自的 name 属性
值。LoggerConfig 会被调配一个日志级别,通过 level 属性来指定。内建的日志级别按优先级从高到底排序有:OFF > FATAL >
ERROR > WARN > INFO > DEBUG > TRACE > ALL,Log4j 2 也反对自定义的日志级别。-->
<Root level="ALL">
<AppenderRef ref="Console"/>
<AppenderRef ref="InfoLogRollingFile"/>
<AppenderRef ref="WarnLogRollingFile"/>
<AppenderRef ref="DebugLogRollingFile"/>
<AppenderRef ref="ErrorLogRollingFile"/>
</Root>
<!-- 每个 LoggerConfig 的日志级别如果没有显式配置,则会继承其父级 LoggerConfig 的日志级别,而 root LoggerConfig 如果没
有配置日志级别,则会为其调配一个默认的 ERROR 级别 -->
<!-- 某个 Logger 所容许的每条日志打印申请都会传递给其 LoggerConfig 中的所有 Appender,也会传递给该 LoggerConfig 的 parent
LoggerConfig 中的 Appender,这种景象称为相加性(Additivity)。也就是说,Appender 会从 LoggerConfig 的继承中继承相加性。这种特
性能够用来汇整某几个 logger 的输入,能够在申明 Logger 的配置文件中设置 additivity="false" 来禁用这种叠加继承 -->
<!-- 记录 druid-sql 的记录 -->
<Logger name="druid.sql.Statement" level="debug" additivity="false">
<appender-ref ref="DruidSqlRollingFile"/>
</Logger>
<!-- 过滤掉 spring 和 mybatis 的一些无用的 DEBUG 信息 -->
<Logger name="org.springframework" level="INFO"/>
<Logger name="org.mybatis" level="INFO"/>
<!--log4j2 自带过滤日志 -->
<Logger name="org.apache.catalina.startup.DigesterFactory" level="error"/>
<Logger name="org.apache.catalina.util.LifecycleBase" level="error"/>
<Logger name="org.apache.coyote.http11.Http11NioProtocol" level="warn"/>
<Logger name="org.apache.sshd.common.util.SecurityUtils" level="warn"/>
<Logger name="org.apache.tomcat.util.net.NioSelectorPool" level="warn"/>
<Logger name="org.crsh.plugin" level="warn"/>
<Logger name="org.crsh.ssh" level="warn"/>
<Logger name="org.eclipse.jetty.util.component.AbstractLifeCycle" level="error"/>
<Logger name="org.hibernate.validator.internal.util.Version" level="warn"/>
<Logger name="org.springframework.boot.actuate.autoconfigure.CrshAutoConfiguration" level="warn"/>
<Logger name="org.springframework.boot.actuate.endpoint.jmx" level="warn"/>
<Logger name="org.thymeleaf" level="warn"/>
</Loggers>
</Configuration>
正文完