良好的日志输出能够在遇到问题的时候很快的定位到出现问题的地方。所以我们首先把log4j集成进去。
我们使用的是log4j2,在使用方面与log4j基本上没什么区别,比较大的区别是log4j2不再支持properties配置文件,支持xml、json格式的文件
在pom文件中添加依赖:
<!-- 从parent项目中出去logging这个包,因为我们使用的是log4j2 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<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>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>log4j-over-slf4j</artifactId>
<version>1.7.24</version>
<exclusions>
<exclusion>
<artifactId>slf4j-api</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
<?xml version="1.0" encoding="UTF-8"?>
<!--
status : 这个用于设置log4j2自身内部的信息输出,可以不设置,
当设置成trace时,会看到log4j2内部各种详细输出
monitorInterval : Log4j能够自动检测修改配置文件和重新配置本身,
设置间隔秒数。此处表示每隔600秒重读一次配置文件
-->
<Configuration status="OFF" monitorInterval="600">
<!--日志级别:TRACE < DEBUG < INFO < WARN < ERROR < FATAL-->
<!--如果设置为WARN,则低于WARN的信息都不会输出-->
<Properties>
<!-- 配置日志文件输出目录,此处为项目根目录下的logs文件夹 -->
<Property name="LOG_HOME">D:\sysLogs\learning</Property>
<property name="FILE_NAME">learningSpringBoot</property>
</Properties>
<Appenders>
<!--这个输出控制台的配置-->
<Console name="Console" target="SYSTEM_OUT">
<!--控制台只输出level及其以上级别的信息(onMatch),
其他的直接拒绝(onMismatch)-->
<ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
<!--日志输出的格式-->
<!--%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n-->
<PatternLayout pattern="|%d{yyyy-MM-dd HH:mm:ss.SSS}|%5p|%5t|%4c:%L|%m%n"/>
</Console>
<RollingRandomAccessFile name="LEARNING" fileName="${LOG_HOME}/${FILE_NAME}.log"
filePattern="${LOG_HOME}/backup/${FILE_NAME}_%d{yyyy-MM-dd}_%i.log">
<!--%d{yyyy-MM-dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n-->
<PatternLayout pattern="|%d{yyyy-MM-dd HH:mm:ss.SSS}|%5p|%5t|%4c:%L|%m%n"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1"/>
<SizeBasedTriggeringPolicy size="20MB"/>
</Policies>
<DefaultRolloverStrategy max="10"/>
</RollingRandomAccessFile>
</Appenders>
<!--然后定义logger,只有定义了logger并引入的appender,appender才会生效-->
<Loggers>
<Logger name="com.zdran.springboot" level="INFO" additivity="true">
<AppenderRef ref="LEARNING"/>
</Logger>
<Logger name="org.springframework" level="INFO" additivity="true">
<AppenderRef ref="LEARNING"/>
</Logger>
<Logger name="org.apache" level="INFO" additivity="true">
<AppenderRef ref="LEARNING"/>
</Logger>
<Root level="INFO">
<Appender-Ref ref="Console"/>
</Root>
</Loggers>
</Configuration>
这么详细的注释就不需要再解释了吧。。。
其中<Property name="LOG_HOME">D:\sysLogs\learning</Property>
还有另外一种设置,我们可以在xml里配置一个占位符,然后可以在命令行启动的时候以参数额形式指定log的目录。可以像下面这样配置:
<Property name="LOG_HOME">${sys:log4j.path}/learning</Property>
启动命令 java -jar xxx.jar -log4j.path=D:\sysLogs\learning
如果你使用了这种配置在启动的时候会报一个
ERROR StatusLogger Cannot access RandomAccessFile java.io.IOException: 文件名、目录名或卷标语法不正确。
java.io.IOException: 文件名、目录名或卷标语法不正确。
这个错误是因为占位符不是有效的路径导致的,可以通过下面的方法配置:
在 VM options 里配置一下参数 -Dlog4j.path=D:\sysLogs
。