log4j2依赖于
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
</dependency>
在我的项目中我是通过Slf4j注解引入日志接口的,配合intellij下的lombok插件,可以省去在各个模块中使用getLogger创建实例的麻烦。slf4j默认是使用logback,我们需要将slf4j桥接到log4j2实现上,由于spring-boot-starter-logging 中引入了logback框架,会导致冲突,需要在spring-boot-starter-web下exclude掉,所以整个日志的依赖部分如下:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<artifactId>logback-classic</artifactId>
<groupId>ch.qos.logback</groupId>
</exclusion>
<exclusion>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-to-slf4j</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!--log-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
</dependency>
log4j2默认使用classpath下的log4j2.xml作为配置文件,自定义的文件需要在application.properties中指定
#log
logging.config=classpath:mylog4j2.xml
log4j2.xml配置文件包括三个部分<properties>, <appenders>和<loggers>, <properties>下可以定义一些变量给<appenders>和<loggers>引用,非必需。
之前参考的一个比较完整的log4j2.xml文件如下(链接):
<?xml version="1.0" encoding="UTF-8"?>
<!-- configuration 有多个属性,常用的有:name(配置名)
status(是否记录log4j2本身的event信息,默认是OFF,
可选值有: "trace", "debug", "info", "warn", "error" and "fatal")
dest(错误流输出位置,标准错误流、文件或远程邮件发送)
strict(是否使用strict xml形式,configuration支持concise(简约)和strict(严格)两种模式的xml。
简约模式下,使得文件编写起来更简洁) -->
<configuration status="OFF">
<!-- 定义如下几个引用名,用于后面配置文件中使用 -->
<Properties>
<property name="log_pattern">%d{yyyy-MM-dd HH:mm:ss z} %-5level %class{36}%L%M - %msg%xEx%n
</property><!-- 日志输出格式 -->
<property name="log-path">${web:rootDir}/logs</property><!-- ${web:rootDir}是项目根目录 -->
<property name="every_file_size">5M</property><!-- 日志切割的最小单位 -->
<property name="output_log_level">debug</property><!-- 日志输出级别 -->
</Properties>
<!-- 先定义所有的appender(日志输出位置) -->
<appenders>
<!-- 输出到控制台 name: 当前appender名 target: 目的位置-->
<Console name="Console" target="SYSTEM_OUT">
<!-- ThresholdFilter: 用于定义过滤机制 -->
<!-- level: 日志过滤级别 -->
<!-- onMatch="ACCEPT":保留level 及以上级别的日志 -->
<!-- onMismatch="DENY":丢掉level 以下级别的日志-->
<!-- onMatch 和 onMissmatch 可选值为:ACCEPT DENY NEUTRAL-->
<ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY" />
<!--这个都知道是输出日志的格式 -->
<PatternLayout pattern="${log_pattern}" />
</Console>
<!-- debug级别日志文件 -->
<!-- RollingFile:日志滚动输出 -->
<!--每次大小超过size,则这size大小的日志会自动进行压缩,作为存档 -->
<RollingFile name="app_debug" fileName="${log-path}/debug/debug.log"
filePattern="${log-path}/debug/debug-%d{yyyy-MM-dd}-%i.log.gz">
<Filters>
<ThresholdFilter level="info" onMatch="DENY" onMismatch="NEUTRAL" />
<ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="NEUTRAL" />
</Filters>
<PatternLayout pattern="${log_pattern}" />
<!-- SizeBasedTriggeringPolicy: 基于日志大小切分日志 -->
<SizeBasedTriggeringPolicy size="${every_file_size}"/>
</RollingFile>
<!-- info级别日志文件 -->
<RollingFile name="app_info" fileName="${log-path}/info/info.log"
filePattern="${log-path}/info/info-%d{yyyy-MM-dd}-%i.log.gz">
<Filters>
<ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL" />
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY" />
</Filters>
<PatternLayout pattern="${log_pattern}" />
<SizeBasedTriggeringPolicy size="${every_file_size}"/>
</RollingFile>
<!-- error级别日志文件 -->
<RollingFile name="app_error" fileName="${log-path}/error/error.log"
filePattern="${log-path}/error/error-%d{yyyy-MM-dd}-%i.log.gz">
<Filters>
<ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY" />
</Filters>
<PatternLayout pattern="${log_pattern}" />
<SizeBasedTriggeringPolicy size="${every_file_size}"/>
</RollingFile>
</appenders>
<!-- 定义logger,只有定义了logger并引入之前定义的appender,appender才会生效 -->
<loggers>
<!--建立一个默认的root的logger,需要在root的level中指定输出的级别, -->
<root level="${output_log_level}">
<appender-ref ref="Console" />
<appender-ref ref="app_debug"/>
<appender-ref ref="app_info"/>
<appender-ref ref="app_error"/>
</root>
</loggers>
</configuration>
上面的说明比较详细。但是我自己还需要对日志级别以不同的颜色高亮显示,所以在网上也找到解决方案参考,即在PatternLayout中使用highlight,一种比较好的格式如下:
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %highlight{%-5level} [%t] %highlight{%c{1.}.%M(%L)}: %msg%n%throwable" disableAnsi="false" noConsoleNoAnsi="false"/>
这个方案在windows和linux测试都可以正常工作,输出的效果如下: