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类型日志信息时会自动推送信息到钉钉

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值