SpringBoot会默认使用logback作为日志框架。
SpringBoot会默认加载classpath:logback-spring.xml或者classpath:logback-spring.groovy文件作为日志配置文件。
注:也可以在系统配置文件中指定SpringBoot加载哪一个文件作为日志配置文件: 在application.properties文件中增加:
logging.config=classpath:xxx.xml 即可指定xxx.xml为日志配置文件。
注:如果是SpringBoot的项目的话,直接把logback-spring.xml配置文件放在src/main/resources文件夹下即可,如:
SpringBoot使用logback的基本步骤
第一步:在pom.xml中引入SpringBoot的基本依赖
注:只要引入了spring-boot-starter-parent依赖,那么其会自动引入logback的相关依赖。
第二步:新建logback-spring.xml文件,放在classpath路径下(我们一般把其放在项目中的src/main/resources文件夹,该文件夹也对应classpath路径)即可
注:logback-spring.xml如何配置,见下文。
logback-spring.xml配置说明
声明:下面的配置较基本,如果实际运用时,感觉下述配置不满足需求,那么请查阅相关文档了解更多。
logback-spring.xml配置示例
-
<?xml version="1.0" encoding="UTF-8"?>
-
-
<!-- scan="true"开启对配置信息的自动扫描(默认时间为60秒扫描一次) 注:当此文件的配置信息发生变化时,此设置的作用就体现出来了,不需要重启服务 -->
-
<configuration scan="true">
-
-
<!-- 通过property标签,来存放key-value数据,便于后面的动态获取,提高程序的灵活性 -->
-
<property name="logFilePositionDir"
-
value=
"C:/Users/dengshuai.ASPIRE/Desktop/log" />
-
-
<!-- >>>>>>>>>>>>>>>>>>>>>>>>>配置appender(可以配置多个)>>>>>>>>>>>>>>>>>>>>>>>>> -->
-
<!--
-
name:自取即可,
-
class:加载指定类(ch.qos.logback.core.ConsoleAppender类会将日志输出到>>>控制台),
-
patter:指定输出的日志格式
-
-->
-
<appender name="consoleAppender"
-
class=
"ch.qos.logback.core.ConsoleAppender">
-
<encoder>
-
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36}:%L- %msg%n
-
</pattern>
-
</encoder>
-
</appender>
-
-
<!--
-
name:自取即可,
-
class:加载指定类(ch.qos.logback.core.rolling.RollingFileAppender类会将日志输出到>>>指定的文件中),
-
patter:指定输出的日志格式 file:指定存放日志的文件(如果无,则自动创建) rollingPolicy:滚动策略>>>每天结束时,都会将该天的日志存为指定的格式的文件
-
FileNamePattern:文件的全路径名模板 (注:如果最后结尾是gz或者zip等的话,那么会自动打成相应压缩包)
-
-->
-
<appender name="fileAppender"
-
class=
"ch.qos.logback.core.rolling.RollingFileAppender">
-
<!-- 把日志文件输出到:项目启动的目录下的log文件夹(无则自动创建)下 -->
-
<file>log/logFile.log
</file>
-
<!-- 把日志文件输出到:name为logFilePositionDir的property标签指定的位置下 -->
-
<!-- <file>${logFilePositionDir}/logFile.log</file> -->
-
<!-- 把日志文件输出到:当前磁盘下的log文件夹(无则自动创建)下 -->
-
<!-- <file>/log/logFile.log</file> -->
-
<rollingPolicy
-
class=
"ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-
<!-- TimeBasedRollingPolicy策略会将过时的日志,另存到指定的文件中(无该文件则创建) -->
-
<!-- 把因 过时 或 过大 而拆分后的文件也保存到目启动的目录下的log文件夹下 -->
-
<fileNamePattern>log/logFile.%d{yyyy-MM-dd}.%i.log
-
</fileNamePattern>
-
<!-- 设置过时时间(单位:<fileNamePattern>标签中%d里最小的时间单位) -->
-
<!-- 系统会删除(分离出去了的)过时了的日志文件 -->
-
<!-- 本人这里:保存以最后一次日志为准,往前7天以内的日志文件 -->
-
<MaxHistory>
-
7
-
</MaxHistory>
-
<!-- 滚动策略可以嵌套;
-
这里嵌套了一个SizeAndTimeBasedFNATP策略,
-
主要目的是: 在每天都会拆分日志的前提下,
-
当该天的日志大于规定大小时,
-
也进行拆分并以【%i】进行区分,i从0开始
-
-->
-
<timeBasedFileNamingAndTriggeringPolicy
-
class=
"ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
-
<maxFileSize>10KB
</maxFileSize>
-
</timeBasedFileNamingAndTriggeringPolicy>
-
</rollingPolicy>
-
<encoder>
-
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36}:%L- %msg%n
-
</pattern>
-
</encoder>
-
</appender>
-
-
<!-- >>>>>>>>>>>>>>>>>>>>>>>>>>>>>使用appender>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -->
-
<!-- 指定[哪个包]下使用[哪个appender],并[设定日志级别] -->
-
<!-- 日志级别: trace|debug|info|warn|error|fatal -->
-
<logger name="com" level="trace">
-
<!-- 指定使用哪个appender -->
-
<appender-ref ref="fileAppender" />
-
</logger>
-
-
<!-- root:logger的根节点,appender-ref:确定使用哪个appender,将日志信息显示在console -->
-
<!--
-
注:如果不指定appender或则指定的是输出到文件的appender的话,
-
那么SpringBoot启动后,将不会在console打印任何信息
-
-->
-
<root level="info">
-
<appender-ref ref="consoleAppender" />
-
</root>
-
</configuration>
给出上述配置在指定文件夹位置生成的log文件示例:
注:最新的日志,都在logFile.log文件中。
注:虽然我们限制了单个log文件的大小,但是其并不是严格的,即:一般会在超过界限大小不多后,进行日志文件的拆分。
注:上述配置有两个“淘汰”,第一个是“非当天的日志,淘汰”;第二个是“超过了指定大小的日志,淘汰”;由于本人测试时间的原因,这里只体现了第二个;其实第一个也是有效的。
代码中使用logback的示例
-
import org.junit.Test;
-
import org.junit.runner.RunWith;
-
import org.slf4j.Logger;
-
import org.slf4j.LoggerFactory;
-
import org.springframework.beans.factory.annotation.Autowired;
-
import org.springframework.boot.test.context.SpringBootTest;
-
import org.springframework.test.context.junit4.SpringRunner;
-
-
import com.alibaba.fastjson.JSON;
-
import com.aspire.mapper.JavaAnnotationMapper;
-
import com.aspire.model.Employee;
-
import com.aspire.util.ExceptionUtil;
-
-
@RunWith(SpringRunner.class)
-
@SpringBootTest(classes = { AbcLogbackDemoApplication.class })
-
public
class AbcLogbackDemoApplicationTests {
-
-
/** 自动装配 */
-
@Autowired
-
JavaAnnotationMapper javaAnnotationMapper;
-
-
/** Logger实例 */
-
static
final Logger logger = LoggerFactory.getLogger(AbcLogbackDemoApplicationTests.class);
-
-
/**
-
* logback测试
-
*
-
* @date 2018年7月26日 下午4:12:56
-
*/
-
@Test
-
public void logbackTest() {
-
logger.info(
"进入logbackTest方法了!");
-
try {
-
Employee employee =
new Employee(
"邓某",
24,
"男");
-
logger.info(
"employee对象的相应参数为:" + JSON.toJSONString(employee));
-
javaAnnotationMapper.singleInsertAutoGetKey(employee);
-
Integer id = employee.getId();
-
logger.info(
"向表中插入employee对象的数据后,自动获取到的主键为:" + id);
-
// System.out.println(1 / 0);
-
}
catch (Exception e) {
-
logger.error(
"出错咯!错误信息:" + e.getMessage(), e.getCause());
-
// 打印出错误堆栈信息
-
e.printStackTrace();
-
}
-
logger.info(
"SpringBoot使用logback示例。");
-
logger.info(
"logbackTest方法执行完毕!");
-
}
-
-
}
注:SpringBoot中使用logback时,e.printStackTrace();既能将错误栈信息输出到console,又能将错误信息输出到logback中。
注:如果有的日志框架不能将e.printStackTrace()的信息打印到日志文件中,那么我们可以使用下面这个工具类,将错误栈信息转化为字符串,然后手动打印到日志文件中。
给出将e.printStackTrace()的信息转化为字符串的工具类
-
import java.io.IOException;
-
import java.io.PrintWriter;
-
import java.io.StringWriter;
-
-
/**
-
* 异常工具类
-
*
-
* @author JustryDeng
-
* @date 2018年7月27日 上午1:32:44
-
*/
-
public
class ExceptionUtil {
-
-
/**
-
* 将异常堆栈 信息 转换为字符串
-
*
-
* @param e
-
* 异常
-
* @return 该异常的错误堆栈信息
-
* @date 2018年7月27日 上午1:35:27
-
*/
-
public static String getStackTraceMessage(Exception e) {
-
StringWriter sw =
null;
-
PrintWriter pw =
null;
-
try {
-
sw =
new StringWriter();
-
pw =
new PrintWriter(sw);
-
// 将异常的的堆栈信息输出到printWriter中
-
e.printStackTrace(pw);
-
pw.flush();
-
sw.flush();
-
}
finally {
-
if (sw !=
null) {
-
try {
-
sw.close();
-
}
catch (IOException e1) {
-
e1.printStackTrace();
-
}
-
}
-
if (pw !=
null) {
-
pw.close();
-
}
-
}
-
return sw.toString();
-
}
-
}