官网
POM
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<!--排除logback-->
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--log4j2 依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
基本结构
log4j 2.x版本不再支持像1.x中的.properties后缀的文件配置方式,2.x版本配置文件后缀名只能为".xml",".json"或者".jsn".
选择配置文件的优先级(从先到后)如下:
- classpath下的名为log4j2-test.json 或者log4j2-test.jsn的文件.
- classpath下的名为log4j2-test.xml的文件.
- classpath下名为log4j2.json 或者log4j2.jsn的文件.
- classpath下名为log4j2.xml的文件
基本结构文件如下,
<Configuration status="INFO">
<Properties>
<Appenders/>
<Loggers/>
</Configuration>
Configuration
根节点
<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出-->
<!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数,如下配置为30分钟检测一次-->
<Configuration status="WARN" monitorInterval="3600">
Properties
变量定义,在此可定义日志目录,日志格式等
<Properties>
<property name="LOG_FILE" value="log"/>
<property name="LOG_HOME">${sys:catalina.base}/logs</property>
<property name="LOG_PATTERN">%d{yyyy-MM-dd HH:mm:ss.SSS} %5p ${sys:PID} %t %l:%m%n</property>
</Properties>
使用变量通过${name}即可
Appendes
1.Console:控制台打印(常用)
<!--默认配置-->
<Console name="STDOUT" target="SYSTEM_OUT">
<!-- %m:显示输出消息 %n:换行 更多配置参见后文Pattern参数配置 -->
<PatternLayout pattern="%m%n"/>
</Console>
2.File:普通日志文件输出
<!--文件会打印出所有信息,append为true,则在日志文件中追加日志,为false则每次项目启动清空文件重新生成,实际作用不大-->
<File name="FileLog" fileName="${LOG_HOME}/file.log" append="true">
<!-- 只输出info及以上级别的信息(info、warn、error)(onMatch),其他的直接拒绝(onMismatch) -->
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="${LOG_PATTERN}" />
</File>
3.RollingFile:按照配置的规则滚动式输出日志文件
<!-- 常规info,
fileName为最新的日志文件,
每当大小超过size,则会以 filePattern 的格式重新生成一个归档文件
这里设置每天会生成一个归档文件
-->
<RollingFile name="RollingFileInfo" fileName="${LOG_HOME}/info.log" filePattern="${LOG_HOME}/info-%d{yyyy-MM-dd}-%i.log">
<!-- 只打印info级别日志 注意先后顺序,优先排除不需要的级别-->
<Filters>
<ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
<PatternLayout pattern="${LOG_PATTERN}" />
<Policies>
<!--
interval属性用来指定多久滚动一次,默认是1,这里配合filePattern
如果 filePattern 为 yyyy-MM-dd,则按天生成归档日志
如果 filePattern 为 yyyy-MM-dd HH-mm,则按分钟生成归档日志
modulate,从0点开始计时,否则从当前时间+interval计时
-->
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
<!-- 指定单个日志文件的大小 -->
<SizeBasedTriggeringPolicy size="5M"/>
</Policies>
<!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件开始覆盖-->
<DefaultRolloverStrategy fileIndex="max" max="7"/>
</RollingFile>
4.RollingRandomAccessFile(常用)
RollingFile的增强版,效率提升20%-200%不等
Loggers
包含Logger和Root
Logger指定自定义,
Root指定全局Logger
<Loggers>
<!--设置指定包或类的日志级别,>
<logger name="org.springframework" level="INFO"></logger>
<!-- 指定项目的根日志 -->
<Root level="info">
<AppenderRef ref="STDOUT"/>
<AppenderRef ref="FileLog"/>
<AppenderRef ref="RollingFileInfo"/>
<AppenderRef ref="RollingFileError"/>
</Root>
</Loggers>
Pattern详细参数
| %c | 列出logger名字空间的全称,如果加上{<层数>}表示列出从最内层算起的指定层数的名字空间 | log4j配置文件参数举例 | 输出显示媒介 |
| 假设当前logger名字空间是"a.b.c" | |||
| %c | a.b.c | ||
| %c{2} | b.c | ||
| %20c | (若名字空间长度小于20,则左边用空格填充) | ||
| %-20c | (若名字空间长度小于20,则右边用空格填充) | ||
| %.30c | (若名字空间长度超过30,截去多余字符) | ||
| %20.30c | (若名字空间长度小于20,则左边用空格填充;若名字空间长度超过30,截去多余字符) | ||
| %-20.30c | (若名字空间长度小于20,则右边用空格填充;若名字空间长度超过30,截去多余字符) | ||
| %C | 列出调用logger的类的全名(包含包路径) | 假设当前类是"org.apache.xyz.SomeClass" | |
| %C | org.apache.xyz.SomeClass | ||
| %C{1} | SomeClass | ||
| %d | 显示日志记录时间,{<日期格式>}使用ISO8601定义的日期格式 | %d{yyyy/MM/dd HH:mm:ss,SSS} | 2005/10/12 22:23:30,117 |
| %d{ABSOLUTE} | 22:23:30,117 | ||
| %d{DATE} | 12 Oct 2005 22:23:30,117 | ||
| %d{ISO8601} | 2005-10-12 22:23:30,117 | ||
| %F | 显示调用logger的源文件名 | %F | MyClass.java |
| %l | 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数 | %l | MyClass.main(MyClass.java:129) |
| %L | 显示调用logger的代码行 | %L | 129 |
| %m | 显示输出消息 | %m | This is a message for debug. |
| %M | 显示调用logger的方法名 | %M | main |
| %n | 当前平台下的换行符 | %n | Windows平台下表示rn UNIX平台下表示n |
| %p | 显示该条日志的优先级 | %p | INFO |
| %r | 显示从程序启动时到记录该条日志时已经经过的毫秒数 | %r | 1215 |
| %t | 输出产生该日志事件的线程名 | %t | MyClass |
| %x | 按NDC(Nested Diagnostic Context,线程堆栈)顺序输出日志 | 假设某程序调用顺序是MyApp调用com.foo.Bar | |
| %c %x - %m%n | MyApp - Call com.foo.Bar. com.foo.Bar - Log in Bar MyApp - Return to MyApp. |
||
| %X | 按MDC(Mapped Diagnostic Context,线程映射表)输出日志。通常用于多个客户端连接同一台服务器,方便服务器区分是那个客户端访问留下来的日志。 | %X{5} | (记录代号为5的客户端的日志) |
| %% | 显示一个百分号 | %% | % |
自用配置
如下配置按天生成日志
<?xml version="1.0" encoding="UTF-8"?>
<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出-->
<!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数,如下配置为30分钟检测一次-->
<Configuration status="WARN" monitorInterval="3600">
<Properties>
<!-- ==============================================公共配置============================================== -->
<!-- 设置日志文件的目录名称 -->
<property name="LOG_HOME" value="${sys:catalina.home}/logs/"/>
<!-- 日志默认存放的位置,可以设置为项目根路径下,也可指定绝对路径 -->
<!-- 存放路径一:通用路径,window平台 -->
<!-- <property name="LOG_HOME">d:/logs/${logFileName}</property> -->
<!-- 存放路径二:web工程专用,java项目没有这个变量,需要删掉,否则会报异常,这里把日志放在web项目的根目录下 -->
<!-- <property name="LOG_HOME">${web:rootDir}/${logFileName}</property> -->
<!-- 存放路径三:web工程专用,java项目没有这个变量,需要删掉,否则会报异常,这里把日志放在tocmat的logs目录下 -->
<!--<property name="LOG_HOME">${sys:catalina.home}/logs/${logFileName}</property>-->
<!-- 控制台默认输出格式,%clr{} 带上颜色,"%-5level":日志级别,"%l":输出完整的错误位置,是小写的L,因为有行号显示,所以影响日志输出的性能 -->
<!--<property name="LOG_PATTERN">%d{yyyy-MM-dd HH:mm:ss.SSS} %clr{%5p} ${sys:PID}-[%t] %l %30c{1.}.%M%clr{(%F:%L)}:%m%n </property>-->
<property name="LOG_PATTERN">%d{yyyy-MM-dd HH:mm:ss.SSS} %5p ${sys:PID} %t %l:%m%n</property>
<property name="LOG_PATTERN_COLOR">%d{yyyy-MM-dd HH:mm:ss.SSS} %clr{%5p} %clr{${sys:PID}}{magenta} %clr{[%15.15t]} %clr{%-40.40c{1.}}{cyan}:%m%n</property>
<!--<property name="LOG_PATTERN">%clr{%d{yyyy-MM-dd HH:mm:ss.SSS}}{faint} %clr{%5p} %clr{${sys:PID}}{magenta} %clr{---}{faint} %clr{[.15t]}{faint} %clr{%-40.40c{1.}}{cyan} %clr{:}{faint} %m%n%xwEx</property>-->
<!--<property name="COLOR_PATTERN">%highlight{%d{HH:mm:ss.SSS} %-5level %logger{36}.%M() @%L - %msg%n}{FATAL=red blink, ERROR=red, WARN=yellow bold, INFO=black, DEBUG=green bold, TRACE=blue}</property>-->
<!-- 日志文件默认输出格式,不带行号输出(行号显示会影响日志输出性能);%C:大写,类名;%M:方法名;%m:错误信息;%n:换行 -->
<!-- <property name="log_pattern">%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] %C.%M - %m%n</property> -->
<!-- 日志文件默认输出格式,另类带行号输出(对日志输出性能未知);%C:大写,类名;%M:方法名;%L:行号;%m:错误信息;%n:换行 -->
<!--<property name="log_pattern">%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] %C.%M[%L line] - %m%n</property>-->
<!-- 日志默认切割的最小单位 -->
<property name="EVERY_FILE_SIZE">1GB</property>
<!-- 日志默认输出级别 -->
<property name="OUTPUT_LOG_LEVEL">INFO</property>
<!-- ===========================================所有级别日志配置=========================================== -->
<!-- 日志默认存放路径(所有级别日志) -->
<property name="ROLLING_FILENAME">${LOG_HOME}/all.log</property>
<!-- 日志默认压缩路径,将超过指定文件大小的日志,自动存入按"年月"建立的文件夹下面并进行压缩,作为存档 -->
<property name="ROLLING_FILEPATTERN">${LOG_HOME}/%d{yyyy-MM}/all-%d{yyyy-MM-dd}-%i.log.gz</property>
<!-- 日志默认同类型日志,同一文件夹下可以存放的数量,不设置此属性则默认为7个,filePattern最后要带%i才会生效 -->
<property name="ROLLING_MAX">30</property>
<!-- 日志默认同类型日志,多久生成一个新的日志文件,这个配置需要和filePattern结合使用,默认为1;
如果设置为1,filePattern是%d{yyyy-MM-dd}到天的格式,则间隔一天生成一个文件
如果设置为12,filePattern是%d{yyyy-MM-dd-HH}到小时的格式,则间隔12小时生成一个文件 -->
<property name="ROLLING_TIME_INTERVAL">1</property>
<!-- ============================================Info级别日志============================================ -->
<!-- Info日志默认存放路径(Info级别日志) -->
<property name="INFO_FILENAME">${LOG_HOME}/info.log</property>
<!-- Info日志默认压缩路径,将超过指定文件大小的日志,自动存入按"年月"建立的文件夹下面并进行压缩,作为存档 -->
<property name="INFO_FILEPATTERN">${LOG_HOME}/%d{yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log.gz</property>
<!-- ============================================Warn级别日志============================================ -->
<!-- Warn日志默认存放路径(Warn级别日志) -->
<property name="WARN_FILENAME">${LOG_HOME}/warn.log</property>
<!-- Warn日志默认压缩路径,将超过指定文件大小的日志,自动存入按"年月"建立的文件夹下面并进行压缩,作为存档 -->
<property name="WARN_FILEPATTERN">${LOG_HOME}/%d{yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log.gz</property>
<!-- Warn日志默认同一文件夹下可以存放的数量,不设置此属性则默认为7个 -->
<!-- ============================================Error级别日志============================================ -->
<!-- Error日志默认存放路径(Error级别日志) -->
<property name="ERROR_FILENAME">${LOG_HOME}/error.log</property>
<!-- Error日志默认压缩路径,将超过指定文件大小的日志,自动存入按"年月"建立的文件夹下面并进行压缩,作为存档 -->
<property name="ERROR_FILEPATTERN">${LOG_HOME}/%d{yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log.gz</property>
<!-- ============================================控制台显示控制============================================ -->
<!-- 控制台显示的日志最低级别 -->
<property name="CONSOLE_PRINT_LEVEL">DEBUG</property>
</Properties>
<!--定义appender -->
<Appenders>
<!-- =======================================用来定义输出到控制台的配置======================================= -->
<Console name="Console" target="SYSTEM_OUT">
<!-- 设置输出格式,不设置默认为:%m%n -->
<PatternLayout pattern="${LOG_PATTERN_COLOR}"/>
</Console>
<!-- =======================================打印INFO级别的日志到文件======================================= -->
<RollingRandomAccessFile name="InfoFile" fileName="${INFO_FILENAME}" filePattern="${INFO_FILEPATTERN}">
<PatternLayout pattern="${LOG_PATTERN}"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
<SizeBasedTriggeringPolicy size="${EVERY_FILE_SIZE}"/>
</Policies>
<DefaultRolloverStrategy max="${ROLLING_MAX}"/>
<Filters>
<ThresholdFilter level="WARN" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
</RollingRandomAccessFile>
<!-- =======================================打印WARN级别的日志到文件======================================= -->
<RollingRandomAccessFile name="WarnFile" fileName="${WARN_FILENAME}" filePattern="${WARN_FILEPATTERN}">
<PatternLayout pattern="${LOG_PATTERN}"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
<SizeBasedTriggeringPolicy size="${EVERY_FILE_SIZE}"/>
</Policies>
<DefaultRolloverStrategy max="${ROLLING_MAX}"/>
<Filters>
<ThresholdFilter level="ERROR" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="WARN" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
</RollingRandomAccessFile>
<!-- =======================================打印ERROR级别的日志到文件======================================= -->
<RollingRandomAccessFile name="ErrorFile" fileName="${ERROR_FILENAME}" filePattern="${ERROR_FILEPATTERN}">
<PatternLayout pattern="${LOG_PATTERN}"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
<SizeBasedTriggeringPolicy size="${EVERY_FILE_SIZE}"/>
</Policies>
<DefaultRolloverStrategy max="${ROLLING_MAX}"/>
<Filters>
<ThresholdFilter level="FATAL" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
</RollingRandomAccessFile>
</Appenders>
<!--定义logger,只有定义了logger并引入的appender,appender才会生效-->
<Loggers>
<!--level指定级别,additivity表示是否向上传递打印日志信息(若为true则向上传递,那么root根对象也会进行日志打印-->
<Logger name="com.mayezi.log4j2.Log4jSpringBootApplication" level="INFO" additivity="false">
<AppenderRef ref="Console"/>
</Logger>
<!--建立一个默认的root的logger-->
<Root level="INFO">
<AppenderRef ref="Console"/>
<AppenderRef ref="InfoFile"/>
<AppenderRef ref="WarnFile"/>
<AppenderRef ref="ErrorFile"/>
</Root>
</Loggers>
</Configuration>
默认配置
在spring-boot-2.x.x.RELEASE.jar中org.springframework.boot.logging.log4j2文件夹下
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Properties>
<Property name="PID">????</Property>
<Property name="LOG_EXCEPTION_CONVERSION_WORD">%xwEx</Property>
<Property name="LOG_LEVEL_PATTERN">%5p</Property>
<Property name="LOG_DATEFORMAT_PATTERN">yyyy-MM-dd HH:mm:ss.SSS</Property>
<Property name="CONSOLE_LOG_PATTERN">%clr{%d{${LOG_DATEFORMAT_PATTERN}}}{faint} %clr{${LOG_LEVEL_PATTERN}} %clr{${sys:PID}}{magenta} %clr{---}{faint} %clr{[%15.15t]}{faint} %clr{%-40.40c{1.}}{cyan} %clr{:}{faint} %m%n${sys:LOG_EXCEPTION_CONVERSION_WORD}</Property>
<Property name="FILE_LOG_PATTERN">%d{${LOG_DATEFORMAT_PATTERN}} ${LOG_LEVEL_PATTERN} ${sys:PID} --- [%t] %-40.40c{1.} : %m%n${sys:LOG_EXCEPTION_CONVERSION_WORD}</Property>
</Properties>
<Appenders>
<Console name="Console" target="SYSTEM_OUT" follow="true">
<PatternLayout pattern="${sys:CONSOLE_LOG_PATTERN}" />
</Console>
</Appenders>
<Loggers>
<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.eclipse.jetty.util.component.AbstractLifeCycle" level="error" />
<Logger name="org.hibernate.validator.internal.util.Version" level="warn" />
<logger name="org.springframework.boot.actuate.endpoint.jmx" level="warn"/>
<Root level="info">
<AppenderRef ref="Console" />
</Root>
</Loggers>
</Configuration>