一起来学SpringBoot(三)日志的配置

在开发和运维中日志的处理可是少不了的,这里我们就来说明一下SpringBoot中的日志配置

首先说明下SpringBoot支持的日志框架

Java Util Logging、Log4J2、logback

其中呢SpringBoot默认使用的是logback,配置方式有默认配置和引用外部文件配置两种。

配置方式

一、默认配置方式

SpringBoot默认使用的是logback。

如果你在Maven中添加的以下依赖

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</dependency>

其实这个是不需要的,因为SpringBoot的spring-boot-starter中包含了spring-boot-starter-logging。

日志级别从高到低分为

TRACE < DEBUG < INFO < WARN < ERROR < FATAL

yml中加入

logging:
level:
root: debug

新建一个测试类,发现日志就已经输出了

如果想自定义包的日志级别 可以在l添加如下配置

logging:
level:
root: debug
com.maoxs: info #自定义包的日志输出级别

如果想改变日志的输出格式则添加如下配置

logging:
pattern:
console: "%d -%msg%n"

如果想输出为文件形式则可以添加如下配置

logging:
pattern:
console: "%d -%msg%n"
path: E:\springBootSomeProject\ # 日志文件,绝对路径或相对路径
file: E:\springBootSomeProject\log # 保存日志文件目录路径
level:
root: debug

logging.file 设置文件,可以是绝对路径,也可以是相对路径。如:logging.file=my.log
logging.path 设置目录,会在该目录下创建spring.log文件,并写入日志内容,如:logging.path=E:\somePaoject

但是二者不能同时使用,如若同时使用,则只有logging.file生效
默认情况下,日志文件的大小达到10MB时会切分一次,产生新的日志文件,默认级别为:ERROR、WARN、INFO

插件使用 由于日志每次都要写这么一行玩意

private final  static Logger logger=LoggerFactory.getLogger(******.class);

可以使用lombok插件 具体安装可以去百度 (未来我会放上使用贴)

也可以实现日志的效果,很方便。


二、自定义日志配置

根据不同的日志系统,你可以按如下规则组织配置文件名,就能被正确加载:

  • Logback:logback-spring.xml, logback-spring.groovy, logback.xml, logback.groovy
  • Log4j:log4j-spring.properties, log4j-spring.xml, log4j.properties, log4j.xml
  • Log4j2:log4j2-spring.xml, log4j2.xml
  • JDK (Java Util Logging):logging.properties

spring官方提示建议您使用-spring变量进行日志记录配置 例如,logback-spring.xml而不是logback.xml

也就是说如果命名为logback.xml将无法初始化日志配置

如果是spring指认的默认配置文件则yml不需要配置任何东西就可以生效,如果不是的话则需要指认下添加如下配置即可

logging:
config: classpath:logback-xxxx.xml

这里贴出一份基础的 logback-spring.xml,供大家测试 想学习更深的话 点击logback学习网站

比较方便的是 不同环境中间的配置 可以用<springProfile name="profile">标签来包括

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 文件输出格式 -->
<property name="PATTERN" value="%-12(%d{yyyy-MM-dd HH:mm:ss.SSS}) |-%-5level [%thread] %c [%L] -| %msg%n" />
<!-- test文件路径 -->
<property name="TEST_FILE_PATH" value="c:/opt/roncoo/logs" />
<!-- pro文件路径 -->
<property name="PRO_FILE_PATH" value="/opt/roncoo/logs" />
<!-- 开发环境 -->
<springProfile name="dev">
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${PATTERN}</pattern>
</encoder>
</appender>
<logger name="com.maoxs" level="debug"/>
<root level="info">
<appender-ref ref="CONSOLE" />
</root>
</springProfile>
<!-- 测试环境 -->
<springProfile name="test">
<!-- 每天产生一个文件 -->
<appender name="TEST-FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 文件路径 -->
<file>${TEST_FILE_PATH}</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 文件名称 -->
<fileNamePattern>${TEST_FILE_PATH}/info.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 文件最大保存历史数量 -->
<MaxHistory>100</MaxHistory>
</rollingPolicy>
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>${PATTERN}</pattern>
</layout>
</appender>
<root level="info">
<appender-ref ref="TEST-FILE" />
</root>
</springProfile>

<!-- 生产环境 -->
<springProfile name="prod">
<appender name="PROD_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${PRO_FILE_PATH}</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${PRO_FILE_PATH}/warn.%d{yyyy-MM-dd}.log</fileNamePattern>
<MaxHistory>100</MaxHistory>
</rollingPolicy>
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>${PATTERN}</pattern>
</layout>
</appender>
<root level="warn">
<appender-ref ref="PROD_FILE" />
</root>
</springProfile>
</configuration>

这里在说下log4j2的配置把 可能有些小伙伴还是喜欢log4j2的配置规则

如果想使用log4j2则需要去除spring-boot-starter-logging 因为会冲突

<!--去除 spring-boot-starter-logging -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 添加log4j2 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

这里也贴出一个log4j2的基础配置,供大家测试 想学习更多配置 点击 log4j2学习网站

<?xml version="1.0" encoding="UTF-8"?>
<!-- Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,
你会看到log4j2内部各种详细输出。可以设置成OFF(关闭) 或 Error(只输出错误信息)。
30s 刷新此配置
-->
<configuration status="WARN" monitorInterval="30">

<!-- 日志文件目录、压缩文件目录、日志格式配置 /Users/admin/Code 根据自己的需求改变-->
<properties>
<Property name="fileName">/Users/admin/Code/log</Property>
<Property name="fileGz">/Users/admin/Code/log/7z</Property>
<Property name="PID">????</Property>
<Property name="LOG_PATTERN">%clr{%d{yyyy-MM-dd HH:mm:ss.SSS}}{faint} %clr{%5p} %clr{${sys:PID}}{magenta} %clr{---}{faint} %clr{[%15.15t]}{faint} %clr{%-40.40c{1.}}{cyan} %clr{:}{faint} %m%n%xwEx</Property>
</properties>

<Appenders>
<!-- 输出控制台日志的配置 -->
<Console name="console" target="SYSTEM_OUT">
<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
<ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
<!-- 输出日志的格式 -->
<PatternLayout pattern="${LOG_PATTERN}"/>
</Console>

<!-- 打印出所有的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档 -->
<RollingRandomAccessFile name="infoFile" fileName="${fileName}/web-info.log" immediateFlush="false"
filePattern="${fileGz}/$${date:yyyy-MM}/%d{yyyy-MM-dd}-%i.web-info.gz">
<PatternLayout pattern="${LOG_PATTERN}"/>

<Policies>
<SizeBasedTriggeringPolicy size="20 MB"/>
</Policies>

<Filters>
<!-- 只记录info和warn级别信息 -->
<ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>

<!-- 指定每天的最大压缩包个数,默认7个,超过了会覆盖之前的 -->
<DefaultRolloverStrategy max="50"/>
</RollingRandomAccessFile>

<!-- 存储所有error信息 -->
<RollingRandomAccessFile name="errorFile" fileName="${fileName}/web-error.log" immediateFlush="false"
filePattern="${fileGz}/$${date:yyyy-MM}/%d{yyyy-MM-dd}-%i.web-error.gz">
<PatternLayout pattern="${LOG_PATTERN}"/>

<Policies>
<SizeBasedTriggeringPolicy size="50 MB"/>
</Policies>

<Filters>
<!-- 只记录error级别信息 -->
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>

<!-- 指定每天的最大压缩包个数,默认7个,超过了会覆盖之前的 -->
<DefaultRolloverStrategy max="50"/>
</RollingRandomAccessFile>
</Appenders>

<!-- Mixed sync/async -->
<Loggers>
<Root level="debug" includeLocation="true">
<AppenderRef ref="console"/>
<AppenderRef ref="infoFile"/>
<AppenderRef ref="errorFile"/>
</Root>

<AsyncRoot level="debug" includeLocation="true">
<AppenderRef ref="console"/>
<AppenderRef ref="infoFile"/>
<AppenderRef ref="errorFile"/>
</AsyncRoot>
</Loggers>
</configuration>

配置方法和logback 自动以配置一样

值得一提的是lombok 也提供了log4j2的简便用法 在类上加入@Log4j2 注解即可

本博文是基于springboot2.x 如果有什么不对的请在下方留言。