ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Spring Boot 2.x 日志配置 与集成 Logback 日志框架,SQL日志记录方式汇总

Spring Boot 2.x 日志配置 与集成 Logback 日志框架,SQL日志记录方式汇总 目录Spring Boot 日志依赖关系Spring boot 全局日志设置Spring boot Log Levels 日志级别Spring boot Log Groups 日志记录器组Logback 日志配置文件详解java -jar 启动设置日志输出级别动态切换 Logback 日志输出级别logback.xml 配置文件定时监控LoggerContext 切换日志输出级别SpringBoot Actuator 监控管理日志为什么 Logger 对象声明 private static finalSpring Boot 日志依赖关系Spring boot 官网文档boot-features-logging1、Sping-boot-starter 是Spring Boot 启动器每一个 Spring boot 应用都会依赖到它2、Sping-boot-starter 依赖 Sping-boot-starter-looging3、Spring Boot 底层默认使用 slf4jlogback 的方式进行日志记录4、Spring Boot 使用中间替换包把其的日志框架都替换成了slf4j5、所以开发中如果要引入其他框架则一定要把这个框架的默认日志依赖移除掉否则会起冲突。如 Spring 框架默认用的是commons-logging而 Spring Boot 底层用的就是Spring 所以自己也要移除掉Spring 的日志框架dependency groupIdorg.springframework/groupId artifactIdspring‐core/artifactId exclusions exclusion groupIdcommons‐logging/groupId artifactIdcommons‐logging/artifactId /exclusion /exclusion6、总而言之Spring Boot 能自动适配所有的日志框架且底层使用 slf4jlogback 的方式记录日志引入其他框架的时候只需要把这个框架依赖的日志框架排除掉即可Spring boot 全局日志设置1、日志的级别由低到高分别为trace(跟踪) debug(调试) info(信息) warn(警告) error(错误)2、在配置文件中调整输出的日志级别日志就只会在这个级别及以后的高级别生效Spring Boot 默认使用 info 级别。import org.junit.Test; import org.junit.runner.RunWith; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import java.util.Date; RunWith(SpringRunner.class) SpringBootTest public class CocoApplicationTests { //获取日志记录器 private static Logger logger LoggerFactory.getLogger(CocoApplicationTests.class); Test public void contextLoads() { logger.trace(这是 trace 日志...); logger.debug(这是 debug 日志...); logger.info(这是 info 日志...); logger.warn(这是 warn 日志...); logger.error(这是 error 日志...); } }3、Spring Boot 的全局配置文件 application.properties或者application.yml 中可以修改日志配置项# 指定特定包下面所有类的日志输出级别未指定的仍然按Spring Boot的默认级别 info 输出. logging.level.com.lctdebug #表示在当前项目根目录下生成app.log日志文件可以是绝对路径或者相对路径,如 logging.file: logs/app.txt logging.fileapp.log # 在项目根路径下创建spring/log目录然后使用 spring.log 作为默认日志文件可以使用绝对或者相对路径 # 当 logging.path 与 logging.file 同时配置时则以 logging.file 为准logging.path 此时不再生效 logging.pathspring/log # 指定控制台输出的日志格式如 # %d{yyyy-MM-dd HH:mm:ss} -- [%thread] %-5level %logger{50} %msg%n # 1、%d 表示日期时间 # 2、%thread 表示线程名 # 3、%‐5level 级别从左显示5个字符宽度 # 4、%logger{50} 表示logger名字最长50个字符否则按照句点分割。 # 5、%msg 日志消息 # 6、%n 换行符 # 7、%line 显示日志输出位置的行号方便寻找位置 logging: pattern: console: %d{yyyy-MM-dd HH:mm:ss} %-5level [%thread] %logger{50}:%line %msg%n logging.pattern.file%d{yyyy-MM-dd HH:mm} -- [%thread] %-5level %logger{50} %msg%n1、默认情况下日志文件超过10M 时会新建文件进行递增比如 spring.log、spring1.log、spring2.log.....,可以使用logging.file.max-size更改大小限制。2、默认情况下日志只记录到控制台不写入日志文件如果要在控制台输出之外写入到日志文件则需要设置 logging.file 或 logging.path 属性。6、Spring boot 官网 日志全部配置项# LOGGING logging.config # Location of the logging configuration file. For instance, classpath:logback.xml for Logback. logging.exception-conversion-word%wEx # Conversion word used when logging exceptions. logging.file # 日志文件名例如app.log). 名称可以绝对路径或者相对路径 logging.file.max-history0 # Maximum of archive log files to keep. Only supported with the default logback setup. logging.file.max-size10MB # Maximum log file size. Only supported with the default logback setup. logging.level.* # 指定特定包下面所有类的日志输出级别未指定的仍然按Spring Boot的默认级别 info 输出.如 logging.level.org.springframeworkDEBUG. logging.path # 日志文件的位置。例如/var/log,与 logging.file 同时存在时以 logging.file 优先. # 用于输出到控制台的追加器模式。仅支持默认的日志恢复设置。 # 下面示例输出的格式为时间 日志级别 进程PID 线程名称 自定义的请求ID 类名:行号 日志消息 换行 logging.pattern.console%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level ${PID} - [%thread] [%X{requestId}] %logger{50}:%line %msg%n logging.pattern.dateformatyyyy-MM-dd HH:mm:ss.SSS # Appender pattern for log date format. Supported only with the default Logback setup. logging.pattern.file #用于输出到文件的追加器模式。仅支持默认的日志恢复设置。 logging.pattern.level%5p # Appender pattern for log level. Supported only with the default Logback setup. logging.register-shutdown-hookfalse # Register a shutdown hook for the logging system when it is initialized.全局配置中的日志配置优先级高于第三方日志框架配置文件7、这些配置是非常有用的比如命令行启动一个 jar 包但是它一执行就自动报错然后退出了都来不急看清错误信息此时则可以拷贝出它的配置文件如 application.yml然后加上一句logging.file: logs/app.txt表示在当前目录下生成日志文件接着再次启动时错误信息就会自动存放进去。Spring boot Log Levels 日志级别1、通过配置 logging.level.logger namelevel 可以设置所有受支持的日志系统的日志级别其中level 是ALL TRACE DEBUG INFO WARN ERROR FATAL OFF之一。官网 26.4 Log Levels。2、可以使用 logging.level.root 配置根日志记录器logging.level.rootWARN #根节点日志级别即整个应用的日志级别设置默认为 info logging.level.org.springframework.webDEBUG #单独某个包的日志级别设置spring web 包日志输出级别 logging.level.org.hibernateERROR # 单独某个包的日志级别设置hibernate 日志输出级别 logging.level.com.wmxinfo #自己项目中指定包下的日志输出级别 #未特别指定的仍然按 Spring Boot 的默认的 logging.level.root 设置输出.Spring boot Log Groups 日志记录器组1、将相关的记录器组合在一起以便可以同时对它们进行配置这通常是很有用的。Spring Boot 允许在 Spring 环境中定义日志组。例如下面通过将 “tomcat” 组添加到 application.properties 中来定义它:logging.group.tomcatorg.apache.catalina, org.apache.coyote, org.apache.tomcat2、定义后可以用一行更改组中所有记录器的级别logging.level.tomcatTRACE3、Spring Boot 包括以下预定义的日志记录组可以开箱即用NameLoggersweborg.springframework.core.codec,org.springframework.http,org.springframework.websqlorg.springframework.jdbc.core,org.hibernate.SQLLogback 日志配置文件详解1、可以直接在 Spring Boot 的全局配置文件中修改 slf4j 的默认配置也可以使用 slf4j 实现框架的自己的配置文件。直接放置再类路径下即可2、官网参考链接根据日志记录系统的不同各自的配置文件文件也不同Logging System(日志系统)Customization(日志文件名称)Logbacklogback-spring.xml, logback-spring.groovy ,logback.xmlor logback.groovyLog4j2log4j2-spring.xmllog4j2.xmlJDK (Java Util Logging)logging.properties3、因为 Spring Boot 底层默认采用 slf4jlogback 的日志组合所以这里以 logback 的 logback.xml(使用logback-spring.xml 文件名也是可以的) 为例将配置为文件放入到类路径下(其它的日志框架实现也是同理)。在线演示源码src/main/resources/logback.xml · 汪少棠/yuanyuan - Gitee.comproperty nameLOG_HOME valuelogs/定义日志存放的根目录可以是相对路径或者绝对路径E:/temp/logs.property nameappName valuesystemLog/property定义日志文件名称.file${LOG_HOME}/${appName}.txt/file指定日志文件存放的全路径.logger namecom.wmx leveldebug/指定应用中指定包路径下的输出日志类型、级别必须根据实际情况改写成自己的.root levelINFOroot 与 logger 是父子关系没有指定 logger 的全部统一用 root 配置的日志级别处理.java -jar 启动设置日志输出级别1、可以在启动的时候通过命令行参数指定日志输出级别相当于logging.level.root 配置的根日志记录器。PS D:\project\IDEA_project\java-se\target java -jar .\java-se-1.0-SNAPSHOT.jar --debug [08:29:51:970] [INFO] - [main] - org.springframework.boot.StartupInfoLogger.logStarting(StartupInfoLogger.java:55) - Starting JavaseApplication v1.0-SNAPSHOT on wangMaoXiong with PID 85676 (D:\project\IDEA_project\java-se\target\java-se-1.0-SNAPSHOT.jar started by Think in D:\project\IDEA_project\java-se\target) [08:29:51:976] [INFO] - [main] - org.springframework.boot.SpringApplication.logStartupProfileInfo(SpringApplication.java:651) - No active profile set, falling back to default profiles: default [08:29:51:978] [DEBUG] - [main] - org.springframework.boot.SpringApplication.load(SpringApplication.java:679) - Loading source class org.example.JavaseApplication [08:29:52:078] [DEBUG] - [main] - org.springframework.boot.logging.DeferredLog.logTo(DeferredLog.java:222) - Loaded config file jar:file:/D:/project/IDEA_project/java-se/target/java-se-1.0-SNAPSHOT.jar!/BOOT-INF/classes!/application.yml (classpath:/application.yml)动态切换 Logback 日志输出级别logback.xml配置文件定时监控方式1修改 logback.xml 配置文件定时监控配置变化情况。!--scan当此属性设置为true时配置文件如果发生改变将会被重新加载默认值为true。 scanPeriod设置监测配置文件是否有修改的时间间隔如果没有给出时间单位默认单位是毫秒当scan为true时此属性生效。默认的时间间隔为1分钟。 debug当此属性设置为true时将打印出logback内部日志信息实时查看logback运行状态。默认值为false。-- configuration scantrue scanPeriod60 seconds debugfalse1、如果是在本地 IDE 编辑器中测试注意修改的是 classes 编译目录下的 logback.xml 文件而不是 resources 目录下的源文件。2、鉴于现在都是微服务开发分布式部署而且为了方便管理基本都是打包后部署在一些平台上面。直接修改日志配置文件不太现实。LoggerContext 切换日志输出级别1、与 log4j2 的方式非常类似LoggerConfig 动态修改日志记录器(推荐)2、自己提供一个 Controller 请求接口用于动态修改日志输出级别想设置什么级别只需要调用一下接口传递一下参数即可无论是设置整个 root 级别还是对指定包或者类都能轻松设置不用重启服务就能立马生效。3、在线演示源码src/main/resources/logback.xml · 汪少棠/yuanyuan - Gitee.comsrc/main/java/com/wmx/yuanyuan/controller/LogbackController.java · 汪少棠/yuanyuan - Gitee.com/** * logback 动态切换指定包或者类的日志输出级别立即生效. * http:localhost:8080/logback/setLevel * http:localhost:8080/logback/setLevel?levelDEBUG * http:localhost:8080/logback/setLevel?levelDEBUGclazzcom.wmx * * param level 日志级别可选值有ALL TRACE DEBUG INFO WARN ERROR FATAL OFF默认为 debug。不区分大小写. * param clazz 指定的包或者类路径为空时默认设置全局(root)日志级别。路径不存在时照样会设置这个路径不会影响全局级别这一点与 log4j2 不同. * 比如 org.springframework。 * return map 返回指定路径的当前日志级别root 表示全局级别 */ GetMapping(value /logback/setLevel) public MapString, Object setLevel(String level, String clazz) { MapString, Object dataMap new HashMap(8); dataMap.put(code, 200); Logger logger; try { // 返回正在使用的 ILoggerFactory 实例. LoggerContext loggerContext (LoggerContext) LoggerFactory.getILoggerFactory(); if (clazz null || .equals(clazz.trim())) { //Logger getLogger(final String name) 根据包路径或类路径获取日志记录器ROOT 表示根记录器 logger loggerContext.getLogger(Logger.ROOT_LOGGER_NAME); dataMap.put(clazz, Logger.ROOT_LOGGER_NAME); } else { //Logger getLogger(final String name) 根据包路径或类路径获取日志记录器ROOT 表示根记录器 //路径不存在也没有关系照样会返回它的日志记录器然后设置输出级别. logger loggerContext.getLogger(clazz); dataMap.put(clazz, clazz); } //Level toLevel(String sArg)转换为日志级别如果转换失败则默认为 debug 级别. //synchronized void setLevel(Level newLevel)为日志记录器设置日志输出级别立即生效. logger.setLevel(Level.toLevel(level)); //获取日志记录器的日志输出级别. String logLevel logger.getLevel().toString(); dataMap.put(level, logLevel); } catch (Exception e) { dataMap.put(code, 500); dataMap.put(msg, e.getMessage()); log.error(e.getMessage(), e); } return dataMap; }SpringBoot Actuator 监控管理日志1、好处1不用编码只需要引用 Spring Boot Actuator 监控然后开启访问端点 /loggers即可轻松查看日志输出级别并进行切换。2、好处2解耦日志框架无论使用的 logback 还是 log4j2 都能轻松切换。!--监控和管理应用程序-- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-actuator/artifactId /dependency3、开启日志访问端点 /loggersmanagement: endpoint: health: show-details: ALWAYS #展示节点的详细信息 endpoints: web: exposure: include: info,health,logfile,loggers #指定公开的访问端点4、查看级别A、发送 GET 请求http://localhost:8080/actuator/loggers 获取日志等级B、http://localhost:8080/actuator/loggers/x.j.z表示指定包或者类的日志输出级别C、返回的信息非常详细包含了 ROOT以及程序中各个包和类的日志级别D、其中 configuredLevel 表示配置级别effectiveLevel 表示有效级别configuredLevel 可能为 null因为没有配置。5、修改日志级别A、post 请求http://localhost:8080/actuator/loggers/x.j.zx.j.z 表示指定的包或者类路径比如修改 root 全局日志输出级别http://localhost:8080/actuator/loggers/rootB、请求 Body 的内容格式{configuredLevel:error}src/main/resources/application.yml · 汪少棠/yuanyuan - Gitee.compom.xml · 汪少棠/yuanyuan - Gitee.com为什么 Logger 对象声明 private static final为什么将 Logger 对象声明为 private static finalSpring Boot 项目记录SQL日志JdbcTemplate 、JPA、MyBatis、其它1、在Spring Boot应用开发中监控和记录SQL执行语句对于调试、性能优化以及确保数据访问层的正确性至关重要。doc/csdn/md/Spring Boot 项目记录SQL日志JdbcTemplate 、JPA、MyBatis、其它.md · 汪少棠/material - Gitee.com。
返回列表