澧县网站设计,企业基本信息查询系统,中文wordpress视频主题,设计制作生态瓶教学设计在继续上一篇的Debug调试之后#xff0c;把spring boot的日志框架使用情况逐步蚕食。 参考#xff1a;http://tengj.top/2017/04/05/springbo 开篇之前#xff0c;贴上完整application.properties日志相关配置 简介#xff1a;spring boot的默认日志框架Logback SLF4J——… 在继续上一篇的Debug调试之后把spring boot的日志框架使用情况逐步蚕食。 参考http://tengj.top/2017/04/05/springbo 开篇之前贴上完整application.properties日志相关配置 简介spring boot的默认日志框架Logback SLF4J——Simple Logging Facade For Java它是一个针对于各类Java日志框架的统一Facade抽象。Java日志框架众多——常用的有java.util.logging, log4j, logbackcommons-logging, Spring框架使用的是Jakarta Commons Logging API (JCL)。而SLF4J定义了统一的日志抽象接口而真正的日志实现则是在运行时决定的——它提供了各类日志框架的binding。 Logback是log4j框架的作者开发的新一代日志框架它效率更高、能够适应诸多的运行环境同时天然支持SLF4J。 默认情况下Spring Boot会用Logback来记录日志并用INFO级别输出到控制台。在刚开始运行一个崭新的spring boot项目时你就可以在控制台看到INFO级别的日志了。 有如下的7各部分 ①时间日期精确到毫秒 ②日志级别ERROR WARNINFODEBUG TRACE 优先级如前面默认情况下是INFO则INFO以及优先级更高的WARN和ERROR会被显示 ③进程ID 就是PID ④分隔符--- 标识实际日志的开始 ⑤线程名方括号括起来可能会截断控制台输出 ⑥Logger名通常使用源代码的类名 ⑦日志内容 可以从上面看到这个spring boot是启动在8928这个进程上的。 在任务管理器中可以看到【如果任务管理的的进程选项卡中看不到PIDhttp://www.cnblogs.com/sxdcgaq8080/p/7853081.html】 一、在项目application.properties配置就可以使用log功能 1.要在spring boot中使用日志功能在pom.xml中配置maven架包 !--使用spring boot日志框架--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-logging/artifactId/dependency 但是其实是不用配置的因为在spring-boot-starter-web下已经引用了日志的架包如下图 2.两种使用情况 日志级别从低到高分为TRACE DEBUG INFO WARN ERROR FATAL如果设置为WARN则低于WARN的信息都不会输出。 2.1 控制台输出 Spring Boot中默认配置ERROR、WARN和INFO级别的日志输出到控制台。您还可以通过启动您的应用程序--debug标志来启用“调试”模式开发的时候推荐开启,以下两种方式 2.1.1在运行命令后加入--debug标志如$ java -jar springTest.jar --debug 2.1.2在application.properties中配置debugtrue该属性置为true的时候核心Logger包含嵌入式容器、hibernate、spring会输出更多内容但是你自己应用的日志并不会输出为DEBUG级别。 如下 配置文件application.properties中配置 debugtrue 启动观察控制台打印出来的日志如下 2.2文件输出 默认情况下Spring Boot将日志输出到控制台不会写到日志文件。如果要编写除控制台输出之外的日志文件则需在application.properties中设置logging.file或logging.path属性。 logging.file设置文件可以是绝对路径也可以是相对路径。如logging.filemy.log logging.path设置目录会在该目录下创建spring.log文件并写入日志内容如logging.path/var/log 如果只配置 logging.file会在项目的当前路径下生成一个 xxx.log 日志文件。 如果只配置 logging.path在 /var/log文件夹生成一个日志文件为 spring.log 注二者不能同时使用如若同时使用则只有logging.file生效 ①默认情况下日志文件的大小达到10MB时会切分一次产生新的日志文件 ②默认级别为ERROR、WARN、INFO 2.2.1 logging.file设置文件 2.2.1.1 配置文件application.properties中配置【logging.file 相对路径】 logging.file myloggin.log 生成日志文件在项目【相当于项目根目录下的相对路径】 2.2.1.2 在配置文件applicarion.properties中配置【logging.file 绝对路径】 logging.file d:/myloggin.log 生成日志文件位置如下 2.2.2 logging.path设置目录 2.2.2.1 在配置文件appilication.properties中设置【logging.path 相对路径】 logging.path /log 生成日志文件在当前项目所在的磁盘的根目录下生成一个log文件夹在文件夹中生成spring.log日志文件【特定名字就是spring.log】 2.2.2.2 在配置文件application.properties中配置【logging.path 绝对路径】 logging.path e:/log 会在指定目录的文件夹中生成spring.log日志文件【特定文件名spring.log】 二、日志等级在application.properties的控制 根据开篇贴上的配置文件中的配置属性可以看到在application.properties中配置日志等级就是一个配置 格式为logging.level.* LEVEL logging.level日志级别控制前缀*为包名或Logger名 LEVEL选项TRACE, DEBUG, INFO, WARN, ERROR, FATAL, OFF 举例 logging.level.com.sxdDEBUG com.sxd包下所有class以DEBUG级别输出包括其优先级以上 logging.level.rootWARN root日志以WARN级别输出包括其优先级以上 三、完全控制和解析日志配置 1.正经的提出问题 上面两步可以看到日志可以在控制台或者文件中显示出来但是都是统一的样式统一的等级或者只能配置一个路径。 如果想完全控制日志 ①例如我想在控制台输出的日志格式是这样的但是在文件中能不能以另外一种格式输出 ②例如我的日志文件输出能不能自己控制文件的大小文件名日志文件总共多少就得清理 ③例如能不能在不同的环境下有不同的日志操作比如在生产环境下我的Service层的日志不会被打印但是在开发环境下就要被打印出来 等等等等的如果想完全控制日志的使用往下看----- 2.慢慢的分析问题 由于日志服务一般都在ApplicationContext创建前就初始化了它并不是必须通过Spring的配置文件控制。那现在在application.properties中配置些许的属性已经不能完全满足了。 所以通过系统属性和传统的Spring Boot外部配置文件 才 可以很好的支持日志控制和管理。 问题1外部的日志配置文件应该叫什么名字呢 根据不同的日志系统你可以按如下规则组织配置文件名就能被正确加载 Logbacklogback-spring.xml, logback-spring.groovy, logback.xml, logback.groovy Log4jlog4j-spring.properties, log4j-spring.xml, log4j.properties, log4j.xml Log4j2log4j2-spring.xml, log4j2.xml JDK (Java Util Logging)logging.properties 注意Spring Boot官方推荐优先使用带有-spring的文件名作为你的日志配置如使用logback-spring.xml而不是logback.xml命名为logback-spring.xml的日志配置文件spring boot可以为它添加一些spring boot特有的配置项【特有的就是spring boot的profile多环境配置】 问题2日志配置文件应该放在哪里呢 放在src/main/resources下面即可。 问题3那不使用logback-spring.xml名字使用自己定义的日志配置文件名行不行 如果你即想完全掌控日志配置但又不想用logback.xml作为Logback配置的名字可以通过logging.config属性指定自定义的名字 logging.configclasspath:logging-自定义.xml 问题4那我想使用spring boot的profile多环境配置日志配置文件应该用什么名字使用流程是怎么样 如果想使用profile多环境配置 第一日志配置文件名应该定义成logback-spring.xml。 第二然后在日志配置文件中使用springProfile namedev /springProfile标签来包住想要在这种环境下使用的配置。使用如下截图 第三最后application.properties配置文件中选择激活哪一种或哪几种环境即可 附录 在没有设置profile的情况下一般启动情况下控制台打印出的日志都能看到这么一句话 3.拆析一个基本的logback-spring.xml文件 下面粘上一个基本的文件代码 ?xml version1.0 encodingUTF-8?configuration scantrue scanPeriod60 seconds debugfalsecontextNamelogback/contextName!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径--property namelog.path valueE:\\log\\logback.log /!--输出到控制台--appender nameconsole classch.qos.logback.core.ConsoleAppenderfilter classch.qos.logback.classic.filter.ThresholdFilterlevelINFO/level/filterencoder!--pattern%d %p (%file:%line\)- %m%n/pattern--!--格式化输出%d:表示日期 %thread:表示线程名 %-5level:级别从左显示5个字符宽度 %msg:日志消息 %n:是换行符--pattern控制台-%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger - %msg%n/patterncharsetGBK/charset/encoder/appender!--输出到文件--appender namefile classch.qos.logback.core.rolling.RollingFileAppenderfile${log.path}/filerollingPolicy classch.qos.logback.core.rolling.TimeBasedRollingPolicyfileNamePatternlogback.%d{yyyy-MM-dd}.log/fileNamePatternmaxHistory30/maxHistorytotalSizeCap1GB/totalSizeCap/rollingPolicyencoder!--格式化输出%d:表示日期 %thread:表示线程名 %-5level:级别从左显示5个字符宽度 %msg:日志消息 %n:是换行符--pattern文件记录-%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n/patterncharsetGBK/charset/encoder/appenderroot levelinfoappender-ref refconsole /appender-ref reffile //rootlogger namecom.sxd.controller/logger namecom.sxd.util.LogTestController levelWARN additivityfalseappender-ref refconsole //logger/configuration View Code 根节点configuration包含的属性 scan:当此属性设置为true时配置文件如果发生改变将会被重新加载默认值为true。 scanPeriod:设置监测配置文件是否有修改的时间间隔如果没有给出时间单位默认单位是毫秒。当scan为true时此属性生效。默认的时间间隔为1分钟。 debug:当此属性设置为true时将打印出logback内部日志信息实时查看logback运行状态。默认值为false。 根节点configuration的子节点 configuration下面一共有2个属性3个子节点分别是 属性一设置上下文名称contextName 每个logger都关联到logger上下文默认上下文名称为“default”。但可以使用contextName设置成其他名字用于区分不同应用程序的记录。一旦设置不能修改,可以通过%contextName来打印日志上下文名称。 contextNamelogback/contextName 属性二设置变量property 用来定义变量值的标签property 有两个属性name和value其中name的值是变量的名称value的值时变量定义的值。通过property定义的值会被插入到logger上下文中。定义变量后可以使“${}”来使用变量。 property namelog.path valueE:\\logback.log / 子节点一appender appender用来格式化日志输出节点有俩个属性name和classclass用来指定哪种输出策略常用就是控制台输出策略和文件输出策略。 控制台输出ConsoleAppender encoder表示对日志进行编码 %d{HH: mm:ss.SSS}——日志输出时间 %thread——输出日志的进程名字这在Web应用以及异步任务处理中很有用 %-5level——日志级别并且使用5个字符靠左对齐 %logger{36}——日志输出者的名字 %msg——日志消息 %n——平台的换行符 ThresholdFilter为系统定义的拦截器例如我们用ThresholdFilter来过滤掉ERROR级别以下的日志不输出到文件中。如果不用记得注释掉不然你控制台会发现没日志~ 输出到文件RollingFileAppender 另一种常见的日志输出到文件随着应用的运行时间越来越长日志也会增长的越来越多将他们输出到同一个文件并非一个好办法。RollingFileAppender用于切分文件日志 其中重要的是rollingPolicy的定义上例中 fileNamePatternlogback.%d{yyyy-MM-dd}.log/fileNamePattern定义了日志的切分方式——把每一天的日志归档到一个文件中 maxHistory30/maxHistory表示只保留最近30天的日志以防止日志填满整个磁盘空间。 同理可以使用%d{yyyy-MM-dd_HH-mm}来定义精确到分的日志切分方式。 totalSizeCap1GB/totalSizeCap用来指定日志文件的上限大小例如设置为1GB的话那么到了这个值就会删除旧的日志。 子节点二root root节点是必选节点用来指定最基础的日志输出级别只有一个level属性。 level:用来设置打印级别大小写无关TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF不能设置为INHERITED或者同义词NULL默认是DEBUG。 root可以包含零个或多个appender-ref元素标识这个appender将会添加到这个logger。 子节点三logger logger用来设置某一个包或者具体的某一个类的日志打印级别、以及指定appender。loger仅有一个name属性一个可选的level和一个可选的addtivity属性。 name:用来指定受此loger约束的某一个包或者具体的某一个类。 level:用来设置打印级别大小写无关TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF还有一个特俗值INHERITED或者同义词NULL代表强制执行上级的级别。如果未设置此属性那么当前loger将会继承上级的级别。 addtivity:是否向上级logger传递打印信息。默认是true。 从上面可以看到logger在实际使用的时候有两种情况。 然后分别在com.sxd.controller中和com.sxd.util.LogTestController中添加相同的日志打印分别看看对应上面两种logger的使用情况 com.sxd.controller.MainController package com.sxd.controller;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;Controller
public class MainController {RequestMapping(/toLogin)public String hello(){return login;}Logger logger LoggerFactory.getLogger(this.getClass());RequestMapping(/log)ResponseBodypublic void logTest(){System.out.println(进入Controller日志控制中心----》》》);//日志级别从低到高分别为// TRACE DEBUG INFO WARN ERROR FATAL//如果设置为WARN则WARN以及往上的才能打印出来logger.trace(日志输出trace[所有痕迹]);logger.debug(日志输出debug[debug调试]);logger.info(日志输出info[信息级别]);logger.warn(日志输出warn[警告级别]);logger.error(日志输出error[错误级别]);}
} View Code com.sxd.util.LogTestController package com.sxd.util;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;Controller
public class LogTestController {Logger logger LoggerFactory.getLogger(this.getClass());ResponseBodyRequestMapping(/log2)public void logTest(){System.out.println(进入util日志控制中心----》》》);//日志级别从低到高分别为// TRACE DEBUG INFO WARN ERROR FATAL//如果设置为WARN则WARN以及往上的才能打印出来logger.trace(日志输出trace[所有痕迹]);logger.debug(日志输出debug[debug调试]);logger.info(日志输出info[信息级别]);logger.warn(日志输出warn[警告级别]);logger.error(日志输出error[错误级别]);}
} View Code 我们引入日志并且打印不同级别的日志然后根据logback-spring.xml中的配置来看看打印了哪几种级别日志。 第一种带有loger的配置不指定级别不指定appender[对应com.sxd.controller.MainController] logger namecom.sxd.controller/将控制controller包下的所有类的日志的打印但是并没用设置打印级别所以继承他的上级root的日志级别“info” 没有设置addtivity默认为true将此loger的打印信息向上级传递 没有设置appender此loger本身不打印任何信息。 root levelinfo将root的打印级别设置为“info”指定了名字为“console”的appender。 当执行com.sxd.controller.MainController类的log方法时MainController在包com.sxd.controllerr中所以首先执行logger namecom.sxd.controller/将级别为“info”及大于“info”的日志信息传递给root本身并不打印 root接到下级传递的信息交给已经配置好的名为“console”的appender处理“console”appender将信息打印到控制台 打印结果如下【spring boot日志乱码的问题】 root接到下级传递的信息交给已经配置好的名为“file”的appender处理“file”appender将信息写入到日志文件中如下 第二种带有多个loger的配置指定级别指定appender【对应com.sxd.util.LogTestController】 控制com.sxd.util.LogTestController类的日志打印打印级别为“WARN” additivity属性为false表示此loger的打印信息不再向上级传递 指定了名字为“console”的appender 这时候执行com.sxd.util.LogTestController类的log方法时先执行logger namecom.sxd.util.LogTestController levelWARN additivityfalse, 将级别为“WARN”及大于“WARN”的日志信息交给此loger指定的名为“console”的appender处理在控制台中打出日志不再向上级root传递打印信息。 打印结果如下 注意1 当然此时日志文件中是没有本次日志的因为本logger中指定了appender-ref refconsole /,特意的指出来在console打印。所以file中并没有。 注意2 如果你把additivityfalse改成additivitytrue的话就会打印两次因为打印信息向上级传递logger本身打印一次root接到后又打印一次。此时file中也会有日志。 完结、 所以最后的最后。 如果你要在代码中使用日志的话仅需要添加 Logger logger LoggerFactory.getLogger(this.getClass()); 然后就可以使用了。 附录1spring boot中使用logback日志乱码处理 附录2spring boot中使用logback日志颜色渲染 附录3spring boot使用logback-spring.xml文件后application.properties文件中关于logging的配置还会起作用么