logback springBoot 配置日志

淡淡的烟草味﹌ 2021-11-05 04:42 584阅读 0赞

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”?>

  1. <!-- 通过property标签,来存放key-value数据,便于后面的动态获取,提高程序的灵活性 -->
  2. <property name="log-dir" value="log" />
  3. <property name="log-name" value="logFile" />
  4. <!-- >>>>>>>>>>>>>>>>>>>>>>>>>配置appender(可以配置多个)>>>>>>>>>>>>>>>>>>>>>>>>> -->
  5. <!--
  6. name:自取即可,
  7. class:加载指定类(ch.qos.logback.core.ConsoleAppender类会将日志输出到>>>控制台),
  8. patter:指定输出的日志格式
  9. -->
  10. <appender name="consoleAppender"
  11. class="ch.qos.logback.core.ConsoleAppender">
  12. <encoder>
  13. <pattern>%d\{HH:mm:ss.SSS\} \[%thread\] %-5level %logger\{36\}:%L- %msg%n</pattern>
  14. <!-- 日志编码 -->
  15. <charset class="java.nio.charset.Charset">UTF-8</charset>
  16. </encoder>
  17. </appender>
  18. <!--
  19. name:自取即可,
  20. class:加载指定类(ch.qos.logback.core.rolling.RollingFileAppender类会将日志输出到>>>指定的文件中),
  21. patter:指定输出的日志格式 file:指定存放日志的文件(如果无,则自动创建) rollingPolicy:滚动策略>>>每天结束时,都会将该天的日志存为指定的格式的文件
  22. FileNamePattern:文件的全路径名模板 (注:如果最后结尾是gz或者zip等的话,那么会自动打成相应压缩包)
  23. -->
  24. <appender name="fileAppender"
  25. class="ch.qos.logback.core.rolling.RollingFileAppender">
  26. <!-- 把日志文件输出到:项目启动的目录下的log文件夹(无则自动创建)下 -->
  27. <file>$\{log-dir\}/$\{log-name\}.log</file>
  28. <!-- 把日志文件输出到:name为logFilePositionDir的property标签指定的位置下 -->
  29. <!-- <file>$\{logFilePositionDir\}/logFile.log</file> -->
  30. <!-- 把日志文件输出到:当前磁盘下的log文件夹(无则自动创建)下 -->
  31. <!-- <file>/log/logFile.log</file> -->
  32. <rollingPolicy
  33. class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
  34. <!-- TimeBasedRollingPolicy策略会将过时的日志,另存到指定的文件中(无该文件则创建) -->
  35. <!-- 把因为 过时 或 过大 而拆分后的文件也保存到目启动的目录下的log文件夹下 -->
  36. <fileNamePattern>$\{log-dir\}/$\{log-name\}.%d\{yyyy-MM-dd\}.%i.log
  37. </fileNamePattern>
  38. <!-- 设置过时时间(单位:<fileNamePattern>标签中%d里最小的时间单位) -->
  39. <!-- 系统会删除(分离出去了的)过时了的日志文件 -->
  40. <!-- 本人这里:保存以最后一次日志为准,往前7天以内的日志文件 -->
  41. <MaxHistory>
  42. 7
  43. </MaxHistory>
  44. <!-- 滚动策略可以嵌套;
  45. 这里嵌套了一个SizeAndTimeBasedFNATP策略,
  46. 主要目的是: 在每天都会拆分日志的前提下,
  47. 当该天的日志大于规定大小时,
  48. 也进行拆分并以【%i】进行区分,i从0开始
  49. -->
  50. <timeBasedFileNamingAndTriggeringPolicy
  51. class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
  52. <maxFileSize>5MB</maxFileSize>
  53. </timeBasedFileNamingAndTriggeringPolicy>
  54. </rollingPolicy>
  55. <encoder>
  56. <!-- 日志输出格式 -->
  57. <pattern>%d\{HH:mm:ss.SSS\} \[%thread\] %-5level %logger\{36\}:%L- %msg%n</pattern>
  58. <!-- 日志编码 -->
  59. <charset class="java.nio.charset.Charset">UTF-8</charset>
  60. </encoder>
  61. </appender>
  62. <!-- >>>>>>>>>>>>>>>>>>>>>>>>>>>>>使用appender>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -->
  63. <!--
  64. 指定\[哪个包\]下使用\[哪个appender\],并设置 记录到日志文件中的日志的最下
  65. 级别(低于次级别的日志信息不回输出记录到日志文件中)
  66. 注:日志级别有: trace|debug|info|warn|error|fatal
  67. 注:当有多处指定了要记录的日志的最下日志级别时,走优先级最高的,优先级:
  68. logback-spring.xml中 > 启动jar包时 > xxx.properties/xxx.yml中
  69. -->
  70. <!--<logger name="com" level="trace">-->
  71. <logger name="com">
  72. <!-- 指定使用哪个appender -->
  73. <appender-ref ref="fileAppender" />
  74. </logger>
  75. <!--
  76. root:logger的根节点,appender-ref:确定使用哪个appender,将日志信息显示在console
  77. 注:如果不指定配置此项的话,那么SpringBoot启动后,将不会在console打印任何信息
  78. -->
  79. <root>
  80. <appender-ref ref="consoleAppender" />
  81. </root>


给出上述配置在指定文件夹位置生成的log文件示例:

注:最新的日志,都在logFile.log文件中。

注:虽然我们限制了单个log文件的大小,但是其并不是严格的,即:一般会在超过界限大小不多后,进行日志文件的
拆分。

注:上述配置有两个“淘汰”,第一个是“非当天的日志,淘汰”;第二个是“超过了指定大小的日志,淘汰”;由于本人
测试时间的原因,这里只体现了第二个;其实第一个也是有效的。

除了在日志配置文件中指定日志文件级别外,我们还可以这样指定日志文件记录日志的级别:

◎启动jar包时,可这样指定日志级别,如:

java -jar logback-demo-0.0.1-SNAPSHOT.jar —logging.level.root=info
◎在配置文件(如:.properties文件)中,可这样指定日志级别,如:

logging.level.root = debug
注:当有多处指定了要记录的日志的最下日志级别时,则会选择使用优先级最高的配置,优先级:
logback-spring.xml中 > 启动jar包时 > xxx.properties/xxx.yml中。

代码中使用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 {

  1. /\*\* 自动装配 \*/
  2. @Autowired
  3. JavaAnnotationMapper javaAnnotationMapper;
  4. /\*\* Logger实例 \*/
  5. static final Logger logger = LoggerFactory.getLogger(AbcLogbackDemoApplicationTests.class);
  6. /\*\*
  7. \* logback测试
  8. \*
  9. \* @date 2018726 下午4:12:56
  10. \*/
  11. @Test
  12. public void logbackTest() \{
  13. logger.info("进入logbackTest方法了!");
  14. try \{
  15. Employee employee = new Employee("邓某", 24, "男");
  16. logger.info("employee对象的相应参数为:" + JSON.toJSONString(employee));
  17. javaAnnotationMapper.singleInsertAutoGetKey(employee);
  18. Integer id = employee.getId();
  19. logger.info("向表中插入employee对象的数据后,自动获取到的主键为:" + id);
  20. // System.out.println(1 / 0);
  21. \} catch (Exception e) \{
  22. logger.error("出错咯!错误信息:" + e.getMessage(), e.getCause());
  23. // 打印出错误堆栈信息
  24. e.printStackTrace();
  25. \}
  26. logger.info("SpringBoot使用logback示例。");
  27. logger.info("logbackTest方法执行完毕!");
  28. \}

}
注:e.printStackTrace()只能将错误堆栈信息输出到console不能将错误堆栈信息输出到日志文件中;使用logback框架时,如果既想将错误堆栈信息输出到console,又想将错误堆栈信息输出到日志文件中,那么在传参时,需要将Throwable异常实例也一起传过去:

给出两个示例:

示例一(不使用marker标记站位,直接写msg)::

示例二(使用marker标记站位写msg):

注:如果用户实现了Marker接口,这里也可以直接写Marker接口的实例。

如果有的日志框架不能将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) throws IOException {
try (StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw)) {
// 将异常的的堆栈信息输出到printWriter中
e.printStackTrace(pw);
pw.flush();
sw.flush();
return sw.toString();
}
}
}
提示:如果是普通Java项目使用logback的话,那么需要引入以下依赖

同时,要将logback-spring.xml改名为logback.xml(因为普通java项目默认能识别logback.xml而不能识别logback-spring.xml),放入classpath下,如:

^_^ 如有不当,欢迎指正!
^_^ 参考链接
https://blog.csdn.net/jayzym/article/details/77196004
^_^ 代码托管链接
https://github.com/JustryDeng/PublicRepository
^_^ 如有不当之处,欢迎指正
^_^ 本文已经被收录进《程序员成长笔记(二)》,笔者JustryDeng
-——————————
版权声明:本文为CSDN博主「justry_deng」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/justry\_deng/article/details/81230155

发表评论

表情:
评论列表 (有 0 条评论,584人围观)

还没有评论,来说两句吧...

相关阅读