SpringBoot中使用logback日志工具
1. 关于日志工具
在企业级应用中日志是最重要的一部分,是诊断系统问题非常重要的手段,在SpringBoot出现之前记录日志最出色的工具是log4j,而SpringBoot中默认集成了更加优秀的工具LogBack,不需要手动添加依赖即可使用。
2. logback基本使用方式
2.1 配置文件
首先在resource文件夹下新建logback-spring.xml文件,这是SpringBoot推荐的命名方式,因为框架可以自动识别并加载
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn">
<property name="logback.logDir" value="logs/"/>
<!--输出到控制台 ConsoleAppender-->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<!--展示格式 layout-->
<encoder>
<charset>UTF-8</charset>
<pattern>%d [%t] %-5level %logger{36}.%M\(%file:%line\) - %msg%n</pattern>
</encoder>
</appender>
<appender name="infoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>${logback.logDir}/info.log</File>
<!--滚动策略,按照时间滚动 TimeBasedRollingPolicy-->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--文件路径,定义了日志的切分方式——把每一天的日志归档到一个文件中,以防止日志填满整个磁盘空间-->
<FileNamePattern>${logback.logDir}/arch/info/info.%d{yyyy-MM-dd}.%i.log.gz</FileNamePattern>
<!-- 单个日志文件最多 100MB -->
<maxFileSize>300MB</maxFileSize>
<!--只保留最近30天的日志-->
<maxHistory>10</maxHistory>
<!--用来指定日志文件的上限大小,那么到了这个值,就会删除旧的日志-->
<!--<totalSizeCap>1GB</totalSizeCap>-->
</rollingPolicy>
<!--日志输出编码格式化-->
<encoder>
<charset>UTF-8</charset>
<pattern>%d [%t] %-5level %logger{36}.%M\(%file:%line\) - %msg%n</pattern>
</encoder>
</appender>
<appender name="errorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">java
<!--如果只是想要 Error 级别的日志,那么需要过滤一下,默认是 info 级别的,ThresholdFilter-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>WARN</level>
</filter>
<!--日志名称,如果没有File 属性,那么只会使用FileNamePattern的文件路径规则
如果同时有<File>和<FileNamePattern>,那么当天日志是<File>,明天会自动把今天
的日志改名为今天的日期。即,<File> 的日志都是当天的。
-->
<File>${logback.logDir}/error/error.log</File>
<!--滚动策略,按照时间滚动 TimeBasedRollingPolicy-->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--文件路径,定义了日志的切分方式——把每一天的日志归档到一个文件中,以防止日志填满整个磁盘空间-->
<FileNamePattern>${logback.logDir}/arch/error.%d{yyyy-MM-dd}.%i.log.gz</FileNamePattern>
<!-- 单个日志文件最多 100MB -->
<maxFileSize>100MB</maxFileSize>
<!--只保留最近30天的日志-->
<maxHistory>10</maxHistory>
<!--用来指定日志文件的上限大小,那么到了这个值,就会删除旧的日志-->
<!--<totalSizeCap>1GB</totalSizeCap>-->
</rollingPolicy>
<!--日志输出编码格式化-->
<encoder>
<charset>UTF-8</charset>
<pattern>%d [%t] %-5level %logger{36}.%M\(%file:%line\) - %msg%n</pattern>
</encoder>
</appender>
<root level="info">
<appender-ref ref="console"/>
<appender-ref ref="infoLog"/>
<appender-ref ref="errorLog"/>
</root>
</Configuration>
以上是最常用的配置方式,可以打印控制台日志,也可以将日志打印到指定文件中,并且按照日志级别分类打印
2.1.1 扩展
- 配置文件的名称默认是logback-spring.xml,如果想使用其他名称如:mylogback.xml,则需要在application.yml文件中添加以下配置:
logging:
config:
classpath:mylogback.xml
- 日志打印级别从低级到高级排序的顺序是:TRACE < DEBUG < INFO < WARN < ERROR,可以使用以下方式过滤日志信息:
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>WARN</level>
</filter>
level设置为WARN,打印到指定文件的日志类型是WARN和高于WARN级别的日志
2.2 基本API使用
接下来你就可以在代码中使用了
@SpringBootApplication
public class LogDemoApplication {
private final static Logger logger = LoggerFactory.getLogger(LogDemoApplication.class);
public static void main(String[] args) {
SpringApplication.run(LogDemoApplication.class, args);
logger.info("Hello Logger");
logger.warn("Hello Logger Warn");
logger.error("Hello Logger Error");
}
}
3. 进阶技巧
3.1 logger标签使用
<loger>
用来设置某一个包或者具体的某一个类的日志打印级别、以及指定<appender>
。<loger>
仅有一个name属性,一个可选的level和一个可选的addtivity属性。<root>
标签其实也是<loger>
,但是它是根loger。只有一个level属性,因为已经被命名为"root".
方式配置日志文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn">
<property name="logback.logDir" value="logs/"/>
<appender name="myLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>${logback.logDir}/kdj.csv</File>
<!--滚动策略,按照时间滚动 TimeBasedRollingPolicy-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--文件路径,定义了日志的切分方式——把每一天的日志归档到一个文件中,以防止日志填满整个磁盘空间-->
<FileNamePattern>${logback.logDir}/record/kdj.%d{yyyy-MM-dd}.%i.csv.gz</FileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>1536MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<totalSizeCap>1GB</totalSizeCap>
</rollingPolicy>
<!--日志输出编码格式化-->
<encoder>
<charset>UTF-8</charset>
<pattern>[%d] %msg%n</pattern>
</encoder>
</appender>
<logger name="myLogger" level="info" additivity="false">
<appender-ref ref="myLog"/>
</logger>
</Configuration>
代码中使用:
@SpringBootApplication
public class LogDemoApplication {
private final static Logger myLogger = LoggerFactory.getLogger("myLogger");
public static void main(String[] args) {
SpringApplication.run(LogDemoApplication.class, args);
myLogger.error("Hello Logger myLogger");
}
}
3.2 自定义Appender
实际项目中可能会出现这样的需求:将error日志同步推送到钉钉机器人(或者邮件),此时就需要使用自定义Appender,下面给个例子:
package com.owner.log;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.AppenderBase;
public class ServiceAlarm extends AppenderBase<ILoggingEvent> {
private static final String DINGTALK_URL = "https://oapi.dingtalk.com/robot/send?access_token=XXXXXX";
private static final long INTERVAL = 10 * 1000 * 60;
private long lastAlarmTime = 0;
private DingtalkClient dingtalkClient;
public ServiceAlarm() {
this.dingtalkClient = new DingtalkClient();
}
@Override
protected void append(ILoggingEvent eventObject) {
if (eventObject == null || eventObject.getFormattedMessage() == null) {
return;
}
long now = System.currentTimeMillis();
if (now - lastAlarmTime < INTERVAL) {
return;
}
lastAlarmTime = now;
dingtalkClient.sendMessage(eventObject.getFormattedMessage(), DINGTALK_URL);
}
}
配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn">
<appender name="errorAlarm" class="net.finbtc.common.util.ServiceAlarm">
<!--如果只是想要 Error 级别的日志,那么需要过滤一下,默认是 info 级别的,ThresholdFilter-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
</appender>
<root level="info">
<appender-ref ref="errorAlarm"/>
</root>
</Configuration>
只需要添加以上配置,在代码中调用普通日志工具类logger打印error类型日志信息时会自动推送信息到钉钉