<?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>