spring boot——logback基本配置

来源:互联网 发布:java事务怎么实现 编辑:程序博客网 时间:2024/06/09 15:42

1. spring boot日志基本了解

spring boot内部使用了Commons Logging来记录日志,同样也保留了外部接口集成其他的日志框架,如:Java-Util-Logging,log4j,slf4j以及这次要讲到的logback。想要使用其他的日志框架就必须先得配置,默认情况下会使用logback日志框架

1.1 配置控制台日志的debug级别

默认情况下控制台是不会输出debug级别的日志的,想要在控制台输出debug级别的日志,只需要在yml配置文件中加入以下配置即可在控制台输出DEBUG日志(但不包含自己应用中的debug日志)。友情提示:debug的日志级别比info级别低哦!
debug: false #控制台输出debug

1.2 如何在生产环境下配置日志的debug级别

java -jar ${path}/*.jar --debug

在启动命令后面加上–debug即可输出debug级别日志

1.3 配置log输出到文件当中

默认情况下spring boot不会将日志输出到文件中,但是我们可以在配置文件当中配置文件名称、路径、日志输出等级以及配置文件所在路径。只需要添加如下配置:

logging:  file: god.log  path: /Users/wujiaqi/Desktop  level: debug  config: classpath:logback-spring.xml

这里需要注意一下注意事项:

1️⃣.这里若不配置具体的包的日志级别,日志文件信息将为空2️⃣.若只配置logging.path,那么将会在/Users/wujiaqi/Desktop文件夹生成一个日志文件为spring.log(ps:该文件名是固定的,不能更改)。如果path路径不存在,会自动创建该文件夹3️⃣.若只配置logging.file,那将会在项目的当前路径下生成一个god.log日志文件。这里可以使用绝对路径如,会自动在桌面下创建文件夹和相应的日志文件。logging.file=/Users/wujiaqi/Desktop/god.log4️⃣.logging.path和logging.file同时配置,不会在这个路径有/Users/wujiaqi/Desktop日志生成,只有file属性会生效5️⃣.logging.path和logging.file的value都可以是相对路径或者绝对路径

总结为三点:

1️⃣.日志级别必须设置2️⃣.file的优先级比path高3️⃣.可以为绝对路径或者相对路径

这只是基础的配置,详细配置我们可以通过config属性定义配置文件所在路径,定义具体的配置文件。

2. logback介绍以及配置

2.1 logback简介

Logback是log4j框架的作者开发的新一代日志框架,它效率更高、能够适应诸多的运行环境,同时天然支持SLF4J。

2.1.1 为什么要使用logback ?
——在开发中不建议使用System.out因为大量的使用会增加资源的消耗。因为使用System.out是在当前线程执行的,写入文件也是写入完毕之后才继续执行下面的程序。而使用Log工具不但可以控制日志是否输出,怎么输出,它的处理机制也是通知写日志,继续执行后面的代码不必等日志写完。——logback高效输出日志,其比log4j效率高。——Spring Boot 提供了一套日志系统,logback是最优先的选择。
2.1.2 Logback的结构
   LogBack被分为3个组件,logback-core, logback-classic 和 logback-access.其中logback-core提供了LogBack的核心功能,是另外两个组件的基础。logback-classic则实现了Slf4j的API,所以当想配合Slf4j使用时,需要将logback-classic加入classpath。logback-access是为了集成Servlet环境而准备的,可提供HTTP-access的日志接口;

2.2 logback与log4j对比

Logback和log4j是非常相似的,如果你对log4j很熟悉,那对logback很快就会得心应手。下面列了logback相对于log4j的一些优点:

**1、更快的实现**  Logback的内核重写了,在一些关键执行路径上性能提升10倍以上。而且logback不仅性能提升了,初始化内存加载也更小了。**2、非常充分的测试**  Logback经过了几年,数不清小时的测试。Logback的测试完全不同级别的。**3、Logback-classic非常自然实现了SLF4j**    Logback-classic实现了 SLF4j。在使用SLF4j中,你都感觉不到logback-classic。而且因为logback-classic非常自然地实现了SLF4J,所以切换到log4j或者其他,非常容易,只需要提供成另一个jar包就OK,根本不需要去动那些通过SLF4JAPI实现的代码。**4、非常充分的文档**  官方网站有两百多页的文档。**5、自动重新加载配置文件**  当配置文件修改了,Logback-classic能自动重新加载配置文件。扫描过程快且安全,它并不需要另外创建一个扫描线程。这个技术充分保证了应用程序能跑得很欢在JEE环境里面。**6、Lilith**   Lilith是log事件的观察者,和log4j的chainsaw类似。而lilith还能处理大数量的log数据 。**7、谨慎的模式和非常友好的恢复**  在谨慎模式下,多个FileAppender实例跑在多个JVM下,能 够安全地写道同一个日志文件。RollingFileAppender会有些限制。Logback的FileAppender和它的子类包括 RollingFileAppender能够非常友好地从I/O异常中恢复。**8、配置文件可以处理不同的情况**   开发人员经常需要判断不同的Logback配置文件在不同的环境下(开发,测试,生产)。而这些配置文件仅仅只有一些很小的不同,可以通过,和来实现,这样一个配置文件就可以适应多个环境。**9、Filters(过滤器**)  有些时候,需要诊断一个问题,需要打出日志。在log4j,只有降低日志级别,不过这样会打出大量的日志,会影响应用性能。在Logback,你可以继续 保持那个日志级别而除掉某种特殊情况,如alice这个用户登录,她的日志将打在DEBUG级别而其他用户可以继续打在WARN级别。要实现这个功能只需 加4行XML配置。可以参考MDCFIlter 。   **10、SiftingAppender(一个非常多功能的Appender)**  它可以用来分割日志文件根据任何一个给定的运行参数。如,SiftingAppender能够区别日志事件跟进用户的Session,然后每个用户会有一个日志文件。   **11、自动压缩已经打出来的log**  RollingFileAppender在产生新文件的时候,会自动压缩已经打出来的日志文件。压缩是个异步过程,所以甚至对于大的日志文件,在压缩过程中应用不会受任何影响。   **12、堆栈树带有包版本**  Logback在打出堆栈树日志时,会带上包的数据。   **13、自动去除旧的日志文件**  通过设置TimeBasedRollingPolicy或者SizeAndTimeBasedFNATP的maxHistory属性,你可以控制已经产生日志文件的最大数量。如果设置maxHistory 12,那那些log文件超过12个月的都会被自动移除。

2.3 自定义日志配置

由于日志服务一般都在ApplicationContext创建前就初始化了,它并不是必须通过Spring的配置文件控制。因此通过系统属性和传统的Spring Boot外部配置文件依然可以很好的支持日志控制和管理。
根据不同的日志系统,你可以按如下规则组织配置文件名,就能被正确加载:

Logback:logback-spring.xml, logback-spring.groovy, logback.xml, logback.groovyLog4j:log4j-spring.properties, log4j-spring.xml, log4j.properties, log4j.xmlLog4j2:log4j2-spring.xml, log4j2.xmlJDK (Java Util Logging):logging.properties

Spring Boot官方推荐优先使用带有-spring的文件名作为你的日志配置(如使用logback-spring.xml,而不是logback.xml),命名为logback-spring.xml的日志配置文件,spring boot可以为它添加一些spring boot特有的配置项(下面会提到)。
上面是默认的命名规则,并且放在src/main/resources下面即可。
如果你即想完全掌控日志配置,但又不想用logback.xml作为Logback配置的名字,可以通过logging.config属性指定自定义的名字:
logging.config=classpath:logging-config.xml
虽然一般并不需要改变配置文件的名字,但是如果你想针对不同运行时Profile使用不同的日
志配置,这个功能会很有用。

2.4 logback属性介绍

2.4.1根节点< configuration >包含的属性:
scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。

根节点< configuration >的子节点:
< configuration >下面一共有2个属性,3个子节点,分别是:
属性一:设置上下文名称< contextName >
每个logger都关联到logger上下文,默认上下文名称为“default”。但可以使用< contextName >设置成其他名字,用于区分不同应用程序的记录。一旦设置,不能修改,可以通过%contextName来打印日志上下文名称。
< contextName >logback< /contextName >
属性二:设置变量< property >
用来定义变量值的标签,< property > 有两个属性,name和value;其中name的值是变量的名称,value的值时变量定义的值。通过< property >定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。

<property name="log.path" value="./logs" />子节点一<appender>

appender用来格式化日志输出节点,有俩个属性name和class,class用来指定哪种输出策略,常用就是控制台输出策略和文件输出策略。

2.4.2 控制台输出ConsoleAppender:
<!--输出到控制台-->    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">        <!--过滤掉ERROR级别以下的日志-->        <filter class="ch.qos.logback.classis.filter.ThresholdFilter" >            <level>ERROR</level>        </filter>        <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->        <encoder>            <pattern>%d{HH:mm:ss.SSS} %-5level [%thread] %logger{36} - %msg%n</pattern>        </encoder>    </appender>
  • %d{HH: mm:ss.SSS}——日志输出时间
  • %thread——输出日志的进程名字,这在Web应用以及异步任务处理中很有用
  • %logger{36}——日志输出者的名字
  • %msg——日志消息
  • %n——平台的换行符
2.4.3 输出到文件RollingFileAppender

另一种常见的日志输出到文件,随着应用的运行时间越来越长,日志也会增长的越来越多,将他们输出到同一个文件并非一个好办法。RollingFileAppender用于切分文件日志:

<appender name="out2File" class="ch.qos.logback.core.rolling.RollingFileAppender">        <!--日志文件输出的文件名-->        <file>${LOG_HOME_SERVICE}.log</file>        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">            <!--归并日志文件输出的文件名-->            <fileNamePattern>${LOG_HOME_SERVICE}-%d{yyyy-MM-dd}.%i.log            </fileNamePattern>            <!--日志文件保留天数-->            <MaxHistory>30</MaxHistory>            <!--文件最大1G-->            <totalSizeCap>1GB</totalSizeCap>            <!--归并日志文件最大大小-->            <TimeBasedFileNamingAndTriggeringPolicy                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">                <MaxFileSize>100MB</MaxFileSize>            </TimeBasedFileNamingAndTriggeringPolicy>        </rollingPolicy>        <encoder>            <pattern>%d{HH:mm:ss.SSS} %-5level [%thread] %logger{36} - %msg%n</pattern>        </encoder>        <!--日志文件最大的大小-->        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">            <MaxFileSize>10MB</MaxFileSize>        </triggeringPolicy>    </appender>
2.4.4 子节点二< root>

root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性。
level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,不能设置为INHERITED或者同义词NULL,默认是DEBUG。
< root >可以包含零个或多个< appender-ref >元素,标识这个appender将会添加到这个loger。

    <root level="INFO">        <appender-ref ref="console" />    </root>
2.4.5 子节点三< logger >

< logger >用来设置某一个包或者具体的某一个类的日志打印级别、以及指定< appender >。< logger >仅有一个name属性,一个可选的level和一个可选的addtivity属性。

  • name:用来指定受此loger约束的某一个包或者具体的某一个类。 l
  • evel:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL和OFF,还有一个特俗值INHERITED或者同义词NULL,代表强制执行上级的级别。如果未设置此属性,那么当前loger将会继承上级的级别。
  • addtivity:是否向上级logger传递打印信息。默认是true。

2.6 多环境日志输出

据不同环境(prod:生产环境,test:测试环境,dev:开发环境)来定义不同的日志输出,在 logback-spring.xml中使用 springProfile 节点来定义,方法如下:
文件名称不是logback.xml,想使用spring扩展profile支持,要以logback-spring.xml命名

    <springProfile name="test, dev">        <logger name="" level=""/>    </springProfile>    <springProfile name="prod">        <logger name="" level=""/>    </springProfile>

可以启动服务的时候指定 profile (如不指定使用默认),如指定prod 的方式为:
java -jar xxx.jar –spring.profiles.active=prod

至此logback基本配置以及如何与spring boot使用讲解完了!