Spring_Boot使用 logback日志(2020.3.19)

Spring-boot使用-logback进行日志记录

前言:

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

为什么使用logback?, logback有什么优点:

  • 内核重写、测试充分、初始化内存加载更小,这一切让logback性能和log4j相比有诸多倍的提升
  • logback非常自然地直接实现了slf4j,这个严格来说算不上优点,只是这样,再理解slf4j的前提下会很容易理解logback,也同时很容易用其他日志框架替换logback
  • logback当配置文件修改了,支持自动重新加载配置文件,扫描过程快且安全,它并不需要另外创建一个扫描线程
  • 支持自动去除旧的日志文件,可以控制已经产生日志文件的最大数量

如果要使用LogBack,原则上是需要添加dependency依赖的

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

但是因为新建的Spring Boot项目一般都会引用spring-boot-starter或者spring-boot-starter-web,而这两个起步依赖中都已经包含了对于spring-boot-starter-logging的依赖,所以,无需额外添加依赖。

Spring Boot默认的日志级别为INFO,这里打印的是INFO级别的日志所以可以显示。

8s1AsO.png

1.- 简单使用

SpringBootLogbackApplication.java

/**
 * <p>
 * 启动类
 * </p>
 */
@SpringBootApplication
@Slf4j // 在需要使用到日记的地方使用>>>>Slf4j注解(前提是引入了Lombok依赖与安装插件)
public class SpringBootLogbackApplication {

	public static void main(String[] args) {
		ConfigurableApplicationContext context = SpringApplication.run(SpringBootLogbackApplication.class, args);
		int length = context.getBeanDefinitionNames().length;
		log.trace("Spring boot启动初始化了 {} 个 Bean", length);
		log.debug("Spring boot启动初始化了 {} 个 Bean", length);
		log.info("Spring boot启动初始化了 {} 个 Bean", length);
		log.warn("Spring boot启动初始化了 {} 个 Bean", length);
		log.error("Spring boot启动初始化了 {} 个 Bean", length);
		try {
			int i = 0;
			int j = 1 / i;
		} catch (Exception e) {
			log.error("【SpringBootLogbackApplication】启动异常:", e);
		}
	}
}

2.- 将日志输出为文件

默认情况下,Spring Boot将日志输出到控制台,不会写到日志文件。如果要编写除控制台输出之外的日志文件,则需在application.yml中设置logging.file或logging.path属性。例如:

logging:
  path: ${spring.application.name}
  file: ${spring.application.name}.log

它们不会同时生效,只配置其中一个就好了!

如果只配置 logging.file,会在项目的当前路径下生成一个 xxx.log 日志文件。

如果只配置 logging.path,会在项目的当前路径下生成一个文件夹里面生成一个日志文件为 spring.log

3.- 级别输出控制

可以控制日志输出级别,可以全局,也可以指定文件夹! 例如:

logging:
  level:
    root: debug #root使用debug级别输出
--------------指定文件夹输出 `↓` -----------
logging:
  level:
    com.chenzhihao: info #指定文件夹输出

4. - 自定义日志配置

一般情况下,我们都是需要自定义日志配置来满足项目的需要;

SpringBoot官方推荐优先使用带有-spring的文件名作为你的日志配置(如使用logback-spring.xml,而不是logback.xml),命名为logback-spring.xml的日志配置文件,spring boot可以为它添加一些spring boot特有的配置项。

上面是默认的命名规则,并且resources资源目录下面即可。

如果想自定义命名,需要在application.yml上加上配置:

logging.config= classpath:${spring.application.name}-config.xml

最为普通的输出到控制台:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
    <!-- 定义有颜色的日记输出格式   -->
    <property name="CONSOLE_LOG_PATTERN"
              value="%red(%d{yyyy-MM-dd HH:mm:ss.SSS}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger) --- %cyan(%msg%n)"/>
    <!--服务名称-->
    <property name="APP_NAME" value="${spring.application.name}"/>

    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
        </filter>
        <encoder>
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>
<!-- 定义级别并引入自定义appender-->
    <root level="info">
        <appender-ref ref="CONSOLE"/>
    </root>
</configuration>

如果要输出到文件: 则添加多一个<appender>标签并定义属性, 然后在<root>根标签引入

例如:

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true">
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
    <!-- 定义有颜色的日记输出格式   -->
		.......
    <!--应用名称-->
    <property name="APP_NAME" value="eureka-client"/>
    <!--日志存储文件夹名-->
    <property name="LOG_FILE_PATH" value="logss"/>
    <!--  控制台属性  -->
		.........
    <!--日志输出为文件-->
    <appender name="FILE_INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--如果只是想要 Info 级别的日志,就只允许INFO 其他过滤-->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <!--匹配到就允许-->
            <onMatch>ACCEPT</onMatch>
            <!--没有匹配到就禁止-->
            <onMismatch>DENY</onMismatch>
        </filter>
        <!--滚动策略,按照时间滚动 TimeBasedRollingPolicy-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--文件路径,定义了日志的切分方式——把每一天的日志归档到一个文件中,以防止日志填满整个磁盘空间-->
            <FileNamePattern>${LOG_FILE_PATH}/${APP_NAME}-info.%d{yyyy-MM-dd}.part_%i.log</FileNamePattern>
            <!--只保留最近30天的日志-->
            <maxHistory>30</maxHistory>
            <!--用来指定日志文件的上限大小,那么到了这个值,就会删除旧的日志-->
            <totalSizeCap>1GB</totalSizeCap>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <!-- maxFileSize:这是活动文件的大小,默认值是10MB -->
                <maxFileSize>2MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <!-- 输出格式  -->
        <encoder>
            <pattern>%date [%thread] %-5level [%logger{100}] %file:%line - %msg%n</pattern>
            <charset>UTF-8</charset> <!-- 此处设置字符集 -->
        </encoder>
    </appender>

<!-- 定义级别并引入自定义appender-->
    <root level="info">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="FILE_INFO"/> <!-- 引入输入文件appender-->
    </root>
</configuration>

5. - 当配置文件更改时,自动加载

configuration 标签上属性介绍

为了让 logback 能够在配置文件改变的时候自动去扫描,需要在 ``configuration标签上添加scan=true属性。 例如:`

默认情况下,一分钟扫描一次配置文件,看是否有更改。通过 configuration 标签上的 scanPeriod 属性可以指定扫描周期。扫描周期的时间单位可以是毫秒、秒、分钟或者小时。30 seconds

注意:如果没有指定时间单位,则默认为毫秒。

当设置了 scan="true",会新建一个 ReconfigureOnChangeTask 任务用于监视配置文件是否变化。ReconfigureOnChangeTask 也会自动监视外部文件的变化。

如果更改后的配置文件有语法错误,则会回退到之前的配置文件。

通过 configuration 标签上的debug属性:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false

6.- 标签说明

<configuration >标签属性上面已经说了!

根标签属性一:contextName

设置上下文名称 <contextName>mylogback</contextName>

每个logger都关联到logger上下文,默认上下文名称为“default”。但可以使用设置成其他名字,用于区分不同应用程序的记录。一旦设置,不能修改,可以通过%contextName来打印日志上下文名称。

根标签属性二:property

设置变量<property name="log.path" value="log" />**

用来定义变量值的标签,有两个属性,name和value;其中name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使${}------“${log.path}”`来使用变量。

子标签节点一: appender:

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

输出控制台与文件输出策略看上面例子。

日志格式:

  • %d{HH: mm:ss.SSS}——日志输出时间。
  • %thread——输出日志的进程名字,这在Web应用以及异步任务处理中很有用。
  • %-5level——日志级别,并且使用5个字符靠左对齐。
  • %logger{36}——日志输出者的名字。
  • %msg——日志消息。
  • %n——平台的换行符。

文件输出策略,重要的是rollingPolicy的定义:

TimeBasedRollingPolicy 是最常用的轮转策略。它是基于时间来定义轮转策略。例如按天或者按月。

其他策略这里就不介绍了。

  • FileNamePattern-------${xxxxx}/logback.%d{yyyy-MM-dd}.log定义了日志的切分方式——把每一天的日志归档到一个文件中;
  • maxHistory -----30表示只保留最近30天的日志,以防止日志填满整个磁盘空间。同理,可以使用%d{yyyy-MM-dd_HH-mm}来定义精确到分的日志切分方式;
  • totalSizeCap ------1GB用来指定日志文件的上限大小,例如设置为1GB的话,那么到了这个值,就会删除旧的日志。使用这个属性时还需要设置 maxHistory 属性。而且,maxHistory 将会被作为第一条件,该属性作为第二条件。
  • maxFileSize日志文件达到了 指定的大小,会进行归档,递增索引从 0 开始。
  • 如果没有File 属性,那么只会使用FileNamePattern的文件路径规则如果同时有和,那么当天日志是,明天会自动把今天的日志改名为今天的日期。即, 的日志都是当天的。
子节点二: root

root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性,用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,不能设置为INHERITED或者同义词NULL。

默认是DEBUG。可以包含零个或多个元素,标识这个appender将会添加到这个logger。

 <root level="info">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="FILE_INFO"/>
 </root>
子节点三: logger

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

  • name:用来指定受此logger约束的某一个包或者具体的某一个类。

  • level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,还有一个特俗值INHERITED或者同义词NULL,代表强制执行上级的级别。如果未设置此属性,那么当前logger将会继承上级的级别。

  • addtivity:是否向上级logger传递打印信息。默认是true。

    <!-- 选择输出sql文件夹或者单独一个类或者文件夹:包路径-->
    <logger name="com.macro.mall.mapper" level="DEBUG"></logger>
    

logback每天生成和大小生成冲突的问题可以看这个解答

个人demo配置好logback.xml的:

拿上修修改改即可使用!

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true">
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
    <!-- 定义有颜色的日记输出格式   -->
    <property name="CONSOLE_LOG_PATTERN"
              value="%red(%d{yyyy-MM-dd HH:mm:ss.SSS}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger) --- %cyan(%msg%n)"/>

    <!-- 定义文件日记输出格式   -->
    <property name="FILE_LOG_PATTERN"
              value="%date [%thread] %-5level [%logger{100}] %file:%line - %msg%n"/>
    <!--应用名称-->
    <property name="APP_NAME" value="eureka-client"/>
    <!--日志存储文件夹名-->
    <property name="LOG_FILE_PATH" value="logss"/>
    <!--  控制台属性  -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
        </filter>
        <encoder>
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>
    <!--日志输出为文件-->
    <appender name="FILE_INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--如果只是想要 Info 级别的日志,就只允许INFO 其他过滤-->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <!--匹配到就允许-->
            <onMatch>ACCEPT</onMatch>
            <!--没有匹配到就禁止-->
            <onMismatch>DENY</onMismatch>
        </filter>
        <!--滚动策略,按照时间滚动 TimeBasedRollingPolicy-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--文件路径,定义了日志的切分方式——把每一天的日志归档到一个文件中,以防止日志填满整个磁盘空间-->
            <FileNamePattern>${LOG_FILE_PATH}/${APP_NAME}-info.%d{yyyy-MM-dd}.part_%i.log</FileNamePattern>
            <!--只保留最近30天的日志-->
            <maxHistory>30</maxHistory>
            <!--用来指定日志文件的上限大小,那么到了这个值,就会删除旧的日志-->
            <totalSizeCap>1GB</totalSizeCap>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <!-- maxFileSize:这是活动文件的大小,默认值是10MB -->
                <maxFileSize>2MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <!-- 输出格式  -->
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
            <charset>UTF-8</charset> <!-- 此处设置字符集 -->
        </encoder>
    </appender>

    <appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--如果只是想要 Error 级别的日志,就只允许Error 其他过滤-->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>${LOG_FILE_PATH}/${APP_NAME}-error.%d{yyyy-MM-dd}.part_%i.log</FileNamePattern>
            <maxHistory>30</maxHistory>
            <totalSizeCap>1GB</totalSizeCap>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>2MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <appender name="FILE_WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--如果只是想要 WARN 级别的日志,就只允许WARN 其他过滤-->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>WARN</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern><FileNamePattern>${LOG_FILE_PATH}/${APP_NAME}-warn.%d{yyyy-MM-dd}.part_%i.log</FileNamePattern></FileNamePattern>
            <maxHistory>30</maxHistory>
            <totalSizeCap>1GB</totalSizeCap>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>2MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

<!-- 定义级别并引入自定义appender-->
    <root level="info">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="FILE_INFO"/>
        <appender-ref ref="FILE_ERROR"/>
        <appender-ref ref="FILE_WARN"/>
    </root>
    <!-- 选择输出sql文件夹或者单独一个类或者文件夹:全路径-->
    <logger name="com.chenzhihao.dao" level="DEBUG"></logger>
</configuration>

日志颜色:

8sjxuF.png
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章