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);
}
}