乡镇网站建设内容规划,wordpress地址如何修改密码,成都旅游攻略详细安排,免费搭建网站的软件文章目录1.为什么需要日志框架2.常见日志框架2.1.日志框架介绍2.2.市面上的日志框架3.Slf4j使用3.1.如何在系统中使用SLF4j3.2.可能存在的问题4.SpringBoot日志的默认配置5.SpringBoot指定日志文件6.切换日志框架1.为什么需要日志框架 通过日志的方式记录系统运行的过程或错误以…
文章目录1.为什么需要日志框架2.常见日志框架2.1.日志框架介绍2.2.市面上的日志框架3.Slf4j使用3.1.如何在系统中使用SLF4j3.2.可能存在的问题4.SpringBoot日志的默认配置5.SpringBoot指定日志文件6.切换日志框架1.为什么需要日志框架 通过日志的方式记录系统运行的过程或错误以便定位问题。日志收集方便后期日志分析 2.常见日志框架
2.1.日志框架介绍
对于我们日常开发日志是经常使用的当然以前的我们可能还傻傻的各种System.out.println(重要数据)在控制台输出各种重要数据呢投入生产的时候再注释掉。到现在为止呢已经有很多日志可供选择了而市面上常见的日志框架有很多比如JCL、SLF4J、Jboss-logging、jUL(Java Util Logging)、log4j、log4j2、logback等等我们该如何选择呢
2.2.市面上的日志框架
JUL、JCL、Jboss-logging、logback、log4j、log4j2、slf4j…
日志的抽象层日志实现JCLJakarta Commons Logging SLF4jSimple Logging Facade for Java jboss-loggingLog4j JULjava.util.logging Log4j2 Logback
左边选一个抽象层、右边来选一个实现类似与我们经常使用的JDBC一样选择不同的数据库驱动。
下面我们先看看日志的抽象层JCL大家应该很熟悉Commons Loggingspring中常用的框架最后一次更新2014年~~~jboss-logging使用的场景太少了就剩下SLF4j了也是我们springboot中使用的日志抽象层。
日志实现大家应该看着都很熟悉把Log4j大家应该用的挺多的Logback是Log4j的升级版本出至于同一个人开发的考虑到以后的升级使用等问题又写出了SLF4j的日志抽象层使用起来更加灵活。JULjava.util.logging一看就知道是java util包下的Log4j2 咋一看像是Log4j的升级版本其实并不是它是apache下生产的日志框架。 SpringBoot底层是Spring框架 , Spring框架默认使用JCL. SpringBoot选用SLF4j 和 Logback 3.Slf4j使用
3.1.如何在系统中使用SLF4j
slf4j官网 https://www.slf4j.org
开发的时候日志记录方法的调用不应该来直接调用日志的实现类而是调用日志抽象层里面的方法 给系统里面导入slf4j的jar和 logback的实现jar就可以。
使用示例
package com.bruceliu.controller;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class HelloWorld {public static void main(String[] args) {Logger logger LoggerFactory.getLogger(HelloWorld.class);logger.info(Hello World);}
}我们现在已经知道了springboot中使用的是 SLF4j和logback但是如果我们想使用log4j该怎么办呢从上面的图示中我们可以看出想要使用log4j我们肯定还是要使用 SLF4j作为抽象层但是中间给我们加入了一层适配层Adaptation layer然后使用log4j进行实现那么我们需要导入图示中的jar包即可其他的也是一样了。所以说以后开发的时候日志记录方法的调用不应该来直接调用日志的实现类而是调用日志抽象层里面的方法 每一个日志的实现框架都有自己的配置文件。使用slf4j以后配置文件还是做成日志实现框架自己本身的配置文件
3.2.可能存在的问题
现在开发中我么想使用slf4jlogback但是对于一些遗留项目中例如Springcommons-logging、Hibernatejboss-logging…等等如何去做到日志同一呢
你想到的问题SLF4j能想不到吗答案是可以的我们看看下面的图就明白了 如何让系统中所有的日志都统一到slf4j 1、将系统中其他日志框架先排除出去 2、用中间包来替换原有的日志框架 3、我们导入slf4j其他的实现 其实通过idea我们创建一个springboot项目也可以查看日志依赖截取其中部分 SpringBoot使用它来做日志功能
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-logging/artifactId
/dependencyparentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion1.3.2.RELEASE/versionrelativePath/ !-- lookup parent from repository --
/parent总结 1、SpringBoot底层也是使用slf4jlogback的方式进行日志记录 2、SpringBoot也把其他的框架的日志都替换成了slf4j 3、如果我们要引入其他框架 SpringBoot能自动适配所有的日志而且底层使用slf4jlogback的方式记录日志引入其他框架的时候只需要把这个框架依赖的日志框架排除掉即可
示例
dependency
groupIdorg.springframework/groupId
artifactIdspring-core/artifactIdexclusionsexclusiongroupIdcommons-logging/groupIdartifactIdcommons-logging/artifactId/exclusion/exclusions
/dependency4.SpringBoot日志的默认配置
SpringBoot日志的默认配置的位置
package com.bruceliu;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;RunWith(SpringRunner.class)
SpringBootTest
public class Springboot1ApplicationTests {// 日志记录器private Logger logger LoggerFactory.getLogger(getClass());Testpublic void contextLoads() {// System.out.println();// 日志的级别:由低到高// tracedebuginfowarnerror// 可以调整需要输出的日志级别: 日志就只会在这个级别及以后的高级别生效logger.trace(这是trace日志...);logger.debug(这是debug日志...);// SpringBoot默认使用的是info级别的, 没有指定级别的就使用SpringBoot默认规定的级别logger.info(这是info日志...);logger.warn(这是warn日志...);logger.error(这是error日志...);}}其他配置
设置日志的级别: logging.level
#修改日志的级别默认root是info
logging.level.roottrace指定日志的文件名: logging.file ,会在当前项目下生成springboot.log日志
# 不指定路径在当前项目下生成springboot.log日志
logging.filespringboot.log# 可以指定完整的路径
logging.filed://springboot.log指定日志的文件的目录: logging.path , 日志文件名称使用SpringBoot默认的输出日志文件名.
# 在当前磁盘的根路径下创建spring文件夹和里面的log文件夹使用spring.log 作为默认文件
logging.path/spring/log如果同时指定了 logging.file , 则使用 logging.file , 不会使用 logging.path 指定日志在控制台输出的格式: logging.pattern.console
# 在控制台输出的日志的格式
logging.pattern.console%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n指定文件中日志输出的格式: logging.pattern.file
# 指定文件中日志输出的格式
logging.pattern.file%d{yyyy-MM-dd} [%thread] %-5level %logger{50} %msg%n日志的输出格式
5.SpringBoot指定日志文件
如果还是不够用的话可以自定义配置。给类路径下放上每个日志框架自己的配置文件即可SpringBoot就不使用他默认配置的
logback.xml示例
logback.xml直接就被日志框架识别了
?xml version1.0 encodingUTF-8?configurationjmxConfigurator /!-- 日志添加到控制台 --appender nameconsole classch.qos.logback.core.ConsoleAppenderencoderpattern%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n/pattern/encoder/appender!-- 滚动记录文件先将日志记录到指定文件当符合某个条件时将日志记录到其他文件 --appender namerollingFile classch.qos.logback.core.rolling.RollingFileAppenderfilelogs/quickstart.log/filerollingPolicy classch.qos.logback.core.rolling.TimeBasedRollingPolicyfileNamePatternlogs/smt.%d{yyyy-MM-dd}.log/fileNamePattern/rollingPolicyencoderpattern%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n/pattern/encoder/appenderappender namebusinessLogFile classch.qos.logback.core.rolling.RollingFileAppender!-- 按每小时滚动文件如果一个小时内达到10M也会滚动文件, 滚动文件将会压缩成zip格式 --rollingPolicy classch.qos.logback.core.rolling.TimeBasedRollingPolicyfileNamePatternlogs/smt-%d{yyyy-MM-dd_HH}.%i.zip/fileNamePatterntimeBasedFileNamingAndTriggeringPolicy classch.qos.logback.core.rolling.SizeAndTimeBasedFNATPmaxFileSize10MB/maxFileSize/timeBasedFileNamingAndTriggeringPolicy/rollingPolicy!-- 独立的pattern --encoderpattern%d{HH:mm:ss.SSS},%msg%n/pattern/encoder/appender!-- project default level 本身没有指定appender不打印 传递给上级root--logger namecom.github.miemiedev.smt levelDEBUG /logger nameorg.mybatis.spring.SqlSessionFactoryBean levelDEBUG /!--log4jdbc --!-- logger namejdbc.sqltiming levelINFO/ --root levelWARNappender-ref refconsole /appender-ref refrollingFile //root/configurationlogback-spring.xml日志框架就不直接加载日志的配置项由SpringBoot解析日志配置可以使用SpringBoot 的高级Profile功能
!-- 日志添加到控制台 --appender nameconsole classch.qos.logback.core.ConsoleAppenderlayout classch.qos.logback.classic.PatternLayoutspringProfile namedevpattern%d{yyyy-MM-dd HH:mm:ss.SSS} ---- [%thread] --- %-5level %logger{50} - %msg%n/pattern/springProfilespringProfile name!devpattern%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n/pattern/springProfile/layout/appender#指定当前模式
spring:profiles:active: dev如果使用logback.xml作为日志配置文件还要使用profile功能会有以下错误 no applicable action for [springProfile]
6.切换日志框架
弃用SpringBoot官方指定的logback日志框架改用别的日志框架实现。但没太大实际意义因为logback是最先进的版本一般没有必要替换。不推荐只是教大家如何切换
pom.xml
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactIdexclusionsexclusionartifactIdlogback-classic/artifactIdgroupIdch.qos.logback/groupId/exclusionexclusionartifactIdlog4j-over-slf4j/artifactIdgroupIdorg.slf4j/groupId/exclusion/exclusions
/dependencydependencygroupIdorg.slf4j/groupIdartifactIdslf4j-log4j12/artifactId
/dependency
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope
/dependency在resource目录下添加log4j.properties
log4j.rootCategoryDEBUG, CONSOLE,LOGFILElog4j.appender.CONSOLEorg.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layoutorg.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern-%p-%d{yyyy/MM/dd HH:mm:ss,SSS}-%l-%L-%m%nlog4j.appender.LOGFILEorg.apache.log4j.FileAppender
log4j.appender.logFile.ThresholdDEBUG
log4j.appender.logFile.ImmediateFlushtrue
log4j.appender.LOGFILE.Appendtrue
log4j.appender.LOGFILE.Filemylog.log
log4j.appender.LOGFILE.layoutorg.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern-%p-%d{yyyy/MM/dd HH:mm:ss,SSS}-%l-%L-%m%n