以前在项目中使用log4j日志,都是别人配置好或者直接网上粘贴代码过来…现在新公司做新系统,要求我配置log4j实现info级别按小时产生新的文件记录,error级别按天产生新的文件记录,所以这次也就好好的看了一下log4j,进入正题:
1、导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
2、配置文件:log4j2.xml (我的项目是springboot,很多项目在使用log4j.xml,只是格式不同,是一样的)。
3、文件详解:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" monitorInterval="30">
<!-- Properties定义一些属性,下面可以引用 -->
<Properties>
<!-- 数据源名称,说明是哪个数据源下的,其实没啥用,可以不要 -->
<Property name="PID">ecif_orgin</Property>
<!-- 控制台日志的输出格式 -->
<Property name="LOG_PATTERN">%clr{%d{yyyy-MM-dd HH:mm:ss.SSS}}{faint} %clr{%5p} %clr{${sys:PID}}{magenta}
%clr{---}{faint} %clr{[%15.15t]}{faint} %clr{%-40.40c{1.}}{cyan} %clr{:}{faint} %m%n%wEx
</Property>
<!-- 日志存储的home目录 -->
<property name="LOG_HOME">logs</property>
<!-- error日志的文件名 -->
<property name="ERROR_FILE_NAME">myError</property>
<!-- warn日志的文件名 -->
<property name="WARN_FILE_NAME">myWarn</property>
<!-- info日志的文件名 -->
<property name="INFO_FILE_NAME">myInfo</property>
<!-- debug日志的文件名 -->
<property name="DEBUG_FILE_NAME">myDebug</property>
<!-- 以上定义了常用4个级别的日志文件,本项目只使用了error和info -->
</Properties>
<Appenders>
<!-- console是控制台输出的日志,和存储在文件中的没关系 -->
<Console name="Console" target="SYSTEM_OUT" follow="true">
<!-- 输出格式就是上面定义的 LOG_PATTERN-->
<PatternLayout pattern="${LOG_PATTERN}"/>
</Console>
<!-- Info log -->
<!-- info级别的日志输出到文件,fileName是当前最新的文件的目录和名字,filePattern是老文件的目录和名字 ,,
注意filePattern中的%d{yyyy-MM-dd-HH},精确到小时,说明按小时生成新文件,至于按几个小时生成,是下面的interval值决定-->
<RollingFile name="InfoLog" fileName="${LOG_HOME}/${INFO_FILE_NAME}.log"
filePattern="${LOG_HOME}/${INFO_FILE_NAME}/$${date:yyyy-MM-dd}/app-%d{yyyy-MM-dd-HH}-%i.log.gz" append="true">
<!-- 输出格式,这里没有在上面的properties中定义 -->
<PatternLayout pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} %level [%thread][%file:%line] - %msg%n"/>
<!-- 设置策略 ,,interval="1"代表一个小时生成一个文件-->
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true" />
</Policies>
<!-- 过滤器 ,过滤掉不需要的级别-->
<Filters>
<!-- warn和warn以上的级别拒绝(DENY) -->
<ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL"/>
<!-- info及info以上的级别接受 -->
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
<!--
以上两个过滤器组合,在日志文件中就只剩下info的了
一般onMatch和onMismatch都是以上面两种组合形式出现
有人说info一定要放在warn后面,否则info以上的级别在info中被接受后,就不会走warn的过滤器里,这个我没试过,感觉有道理
如果对log4j日志级别不清楚,一定要先弄清楚
-->
</Filters>
</RollingFile>
<!-- 以下这个是按天生成error级别的 日志文件,就不详解了-->
<RollingFile name="ErrLog" fileName="${LOG_HOME}/${ERROR_FILE_NAME}.log"
filePattern="${LOG_HOME}/${ERROR_FILE_NAME}/$${date:yyyy-MM-dd}/app-%d{yyyy-MM-dd}-%i.log.gz" append="true">
<!-- 输出格式 -->
<PatternLayout pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} %level [%thread][%file:%line] - %msg%n"/>
<!-- 设置策略 -->
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true" />
</Policies>
<Filters>
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
</RollingFile>
</Appenders>
<Loggers>
<Logger name="org.hibernate.validator.internal.util.Version" level="debug"/>
<Logger name="org.hibernate.SQL" level="debug"/>
<Logger name="org.apache.coyote.http11.Http11NioProtocol" level="warn"/>
<Logger name="org.apache.tomcat.util.net.NioSelectorPool" level="warn"/>
<Logger name="org.apache.catalina.startup.DigesterFactory" level="error"/>
<!-- 把上面定义的三个输出目标引用进来 -->
<Root level="debug">
<AppenderRef ref="Console"/>
<AppenderRef ref="ErrLog"/>
<AppenderRef ref="InfoLog"/>
</Root>
</Loggers>
</Configuration>
以上是我按小时和天数来生成文件,,也可以按文件大小等等,方法是一样的。