Sprint Boot日志功能的使用

  在项目开发中日志功能相当重要,日志功能是一个非常好的开发助手,在本地开发环境中可以用来打印调试代码,通过日志打印的时间顺序分析程序的运行情况,从而找到问题所在,在测试环境可以用于IO性能、高并发支持、负载压力测试提供数据记录,在生产环境可以用来记录“接口状态”,“在线支付回调”, “定时任务执行”,“邮件群发”,“短信群发”等异常结果记录,在不同的环境中我们需要设置不同的日志级别。

日志级别:

Sprint Boot提供的日志功能,日志类库使用的是Slf4j、日志系统使用的是Logback。SpringBoot的Logging配置的级别有7个:

1.static Level DEBUG:
    DEBUG Level指出细粒度信息事件对调试应用程序是非常有帮助的。

2.static Level INFO:
    INFO level表明 消息在粗粒度级别上突出强调应用程序的运行过程。

3.static Level WARN:
    WARN level表明会出现潜在错误的情形。

4.static Level ERROR:
    ERROR level指出虽然发生错误事件,但仍然不影响系统的继续运行。

5.static Level FATAL:
    FATAL level指出每个严重的错误事件将会导致应用程序的退出。

Log4j日志提供了8中日志级别,功能比较强大,但Sprint Boot框架提供的日志功能完全可以满足开发需求。

Sprint Boot框架的默认级别为INFO

日志输出的优先级顺序: TRACE < DEBUG < INFO< WARN < ERROR < FATAL < OFF

通过指定日志级别(INFO)及输出源(console,myFile),可以指定日志在控制台和文件输出,并且只输出INFO级别以上的日志,不会输出DEBUG日志,如下图:

Sprint Boot日志输出有三种方式:

1.控制台输出,作为默认的输出方式,不需要配置;

2.指定文件输出
指定日志输出到指定的文件,输出的位置在项目所在文件件位置,可以在yml配置文件中指定名称,配置如下:

logging:
    level:
      # 设置Logback日志打印级别
      root: DEBUG
            # 设置mybatis日志打印级别
      main.blog.mapper: DEBUG
            # 按照默认的名称spring.log,生成到指定路径及日志
        path: D:/JavaWeb/boot/logs
        # 不指定的情况下默认生成在项目根目录,按照配置生成所需的日志名称
        file: web.log

如果logging.path路径不存在,会自动创建该文件夹,这里需要注意logging.path方式和logging.file方式,只能选择一种,如果两种方式配置上,logging.path方式不会生效,logging.path和logging.file的值都可以是相对路径或者绝对路径

3.自定义日志配置管理

使用自定义配置的方式,在resources文件夹下增加logback-spring.xml日志配置文件,springBoot的自动配置会检测类路径的类库来自动激活相应的日志系统,在类路径的根目录中提供一个适合的配置文件可以对日志系统进行更进一步的定制,配置文件的路径也可以通过属性:logging.config来指定

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <property name="LOGS_HOME" value="logs"/>

    <appender name="file"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOGS_HOME}/app.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOGS_HOME}/app.%d{yyyy-MM-dd}.log
            </fileNamePattern>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>%date %5level [%thread] %logger{35} %msg%n</pattern>
        </encoder>
    </appender>

    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} %p[%t] %logger{5} &lt;%m&gt;%n</pattern>
        </encoder>
    </appender>

    <appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>%d - %msg%n</pattern>
        </layout>
    </appender>
    <appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>DENY</onMatch>
            <onMismatch>ACCEPT</onMismatch>
        </filter>
        <encoder>
            <pattern>%msg%n</pattern>
        </encoder>
        <!--滚动策略-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--路径-->
            <!-- winwods -->
            <fileNamePattern>logsexample.info.%d.log</fileNamePattern>
            <!--<fileNamePattern>/data/log/crawler.info.%d.log</fileNamePattern>-->
        </rollingPolicy>
    </appender>
    <appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>
        <encoder>
            <pattern>%msg%n</pattern>
        </encoder>
        <!--滚动策略-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--路径-->
            <fileNamePattern>logsexample.error.%d.log</fileNamePattern>
            <!--<fileNamePattern>/data/log/crawler.error.%d.log</fileNamePattern>-->
        </rollingPolicy>
    </appender>

    <root level="INFO">
        <appender-ref ref="stdout"/>
        <!--<appender-ref ref="file"/>-->
        <appender-ref ref="consoleLog"/>
        <appender-ref ref="fileInfoLog"/>
        <appender-ref ref="fileErrorLog"/>
    </root>

    <logger name="com.project.all" level="DEBUG"/>

</configuration>

springboot 日志系统loging结合@Scheduled定时器的使用,代码如下:

package com.blog.controller;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Controller;

@Controller("Task")
public class TaskController
{
    private static final Logger logger = LoggerFactory.getLogger(TaskController.class);

    private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy:mm:dd HH:mm:ss");
    
    /**
     * 每5秒执行一次
     * 
     * @auther huxiaoguang
     * @return void
     */
    @Scheduled(fixedRate = 5000)
    public void Task() 
    {
        logger.debug("定时任务执行时间:"+ dateFormat.format(new Date()));
        logger.info("定时任务执行时间:"+ dateFormat.format(new Date()));
        logger.warn("定时任务执行时间:"+ dateFormat.format(new Date()));
        logger.error("定时任务执行时间:"+ dateFormat.format(new Date()));
    }
}