SpringBoot 日志设置


 

logback简介

日志的作用

  • 便于分析程序执行过程
  • 方便调试
  • 可以将业务数据存储到文件、数据库、es,便于统计分析

常见的日志组件:log4j、logback、slf4j、commons-logging。

日志框架的选择对性能有一定影响,尤其是需要大量使用日志的项目。springboot2.x默认使用logback,logback是在log4j的基础上改进而来的,logback只是将信息输出日志到控制台、文件等终端,程序要输出信息还需借助其他日志框架,常见的搭配是logback+slf4j。
 

logback的日志级别:TRACE < DEBUG < INFO(默认) < WARN < ERROR < FATAL

默认格式:日期时间   日志级别   pid   线程名(main是主线程)  哪个类输出的日志(包名.类名)  信息

2020-05-24 16:51:38.323  INFO 25168 --- [           main] com.chy.visit.VisitApplication           : No active profile set, falling back to default profiles: default

pid即进程号,唯一标识一个进程,比如上面运行的项目的pid是25168

 

logback常用配置

resources下新建 logback.xml 或 logback-spring.xml ,springboot应用启动时会自动加载这个文件,官方推荐使用logback-spring.xml,因为可以自动应用一些spring的配置。
 

彩色日志+区分环境+逐日输出+springboot admin实时查看日志+常用输出级别

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">

    <!-- 服务名,统一应用于log文件名 -->
    <property name="SERVER-NAME" value="user-server"/>

    <!-- 配置不同环境下的日志存储目录,会自动识别yml中active指定的环境 -->
    <springProfile name="dev">
        <property name="LOG_HOME" value="C:/Users/chy/Desktop/日志"/>
    </springProfile>
    <springProfile name="test">
        <property name="LOG_HOME" value="/app/微服务/${SERVER-NAME}"/>
    </springProfile>
    <springProfile name="prod">
        <property name="LOG_HOME" value="/var/logs/${SERVER-NAME}"/>
    </springProfile>

    <!-- 指定彩色日志渲染规则 -->
    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
    <conversionRule conversionWord="wex"
                    converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
    <conversionRule conversionWord="wEx"
                    converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>

    <!-- 指定彩色日志的格式,LN后面是行数 -->
    <property name="CONSOLE_LOG_PATTERN"
              value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:-}){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(LN:%L  ){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>

    <!-- 控制台输出 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!-- 引用日志格式 -->
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>utf8</charset>
        </encoder>
    </appender>

    <!-- 逐日输出文件 -->
    <appender name="DAY_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 日志文件名 -->
            <FileNamePattern>${LOG_HOME}/${SERVER-NAME}-%d{yyyy-MM-dd}.log</FileNamePattern>
            <!-- 日志文件保留天数 -->
            <MaxHistory>30</MaxHistory>
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!-- 指定格式:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 -->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <!--<pattern>${CONSOLE_LOG_PATTERN}</pattern>-->
        </encoder>
        <!-- 日志文件最大体积 -->
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <MaxFileSize>500MB</MaxFileSize>
        </triggeringPolicy>
    </appender>

    <!-- 全部日志输出到一个文件中,用于springboot admin实时查看应用日志 -->
    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>${LOG_HOME}/${SERVER-NAME}-all.log</file>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!-- 指定格式:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 -->
            <!--<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>-->
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
        </encoder>
    </appender>

    <!-- 默认输出级别 -->
    <root level="INFO">
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="DAY_FILE"/>
        <appender-ref ref="FILE"/>
    </root>

    <!-- 给特殊的包指定输出级别 -->
    <logger name="com.apache.ibatis" level="WARN" />
    <logger name="java.sql.Connection" level="WARN" />
    <logger name="java.sql.Statement" level="WARN" />
    <logger name="java.sql.PreparedStatement" level="WARN" />
    <logger name="java.sql.ResultSet" level="DEBUG" />
    <logger name="com.alibaba.druid.pool.DruidPooledResultSet" level="ERROR" />

    <logger name="org.apache.shiro" level="WARN" />
    <logger name="springfox.documentation" level="WARN" />

</configuration>
  • 彩色日志在springboot admin中、使用tail -f查看都是正常的,但使用记事本之类的纯文本阅读器打开是乱码,使用时要注意。尽量不要使用彩色日志这种花里花哨的东西,拉低性能。
  • 可以把<appender>、<root>、<logger>之类的配置放在<springProfile>中,只在指定的环境中起作用
     

打印日志

使用apache commons的日志桥接类

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class Xxx {

    private Log log = LogFactory.getLog(this.getClass());
    // private static Log log = LogFactory.getLog(Xxx.class);

    public void xxx(){
        log.info("xxx");
    }

}

老项目使用apache commons提供的日志接口,依赖中提供log4j、log4j2、slf4j等具体的日志实现框架,由具体的日志实现框架提供实现,但不直接使用它们,这样更换日志框架时无需改动程序中日志输出的代码。

 

使用slf4j

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Xxx {
	// slf4j的logger
    private static Logger logger = LoggerFactory.getLogger(this.getClass());

    public void xxx(){
        String username="xxx", tel="xxx", address="xxx";
        log.info("username:{},tel:{},address:{}",username,tel,address);
    }

}

新项目尽量使用slf4j,slf4j可以使用占位符,性能更高。

使用slf4j输出多个值时,尽量不要使用+号拼接字符串,使用占位符代替。

 

使用lombok的注解创建log对象

import lombok.extern.slf4j.Slf4j;

@Slf4j   //lombok的日志注解会自动创建对应的Logger对象
public class Xxx {

    public void xxx(){
        String username="xxx", tel="xxx", address="xxx";
        log.info("username:{},tel:{},address:{}",username,tel,address);
    }

}
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页