SpringBoot下的Logback和Slf4j

Logback是由log4j创始人设计的又一个开源日志组件。logback当前分成三个模块:logback-core,logback-classic和logback-access。logback-core是其它两个模块的基础模块。logback-classic是log4j的一个改良版本。此外logback-classic完整实现SLF4J API使你可以很方便地更换成其它日志系统如log4j或JDK14 Logging。logback-access访问模块与Servlet容器集成提供通过Http来访问日志的功能。
SLF4J,即简单日志门面(Simple Logging Facade for Java),不是具体的日志解决方案,它只服务于各种各样的日志系统。按照官方的说法,SLF4J是一个用于日志系统的简单Facade,允许最终用户在部署其应用时使用其所希望的日志System。

Logback中文手册

配置文件加载顺序

22:25:59,050 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback-test.xml]
22:25:59,050 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.groovy]
22:25:59,051 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Found resource [logback.xml] at [file:/D:/IdeaProjects/wang/out/production/resources/logback.xml]
22:25:59,148 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - Will scan for changes in [file:/D:/IdeaProjects/wang/out/production/resources/logback.xml] 

Logback配置文件

<!-- scan=true : 当配置文件更改时,自动加载-->
<!-- scanPeriod = 30 seconds 扫描周期30秒 -->
<!-- packagingData="true" 显示包数据
     如果启用了展示包数据,logback 会在堆栈的每一行显示 jar 包的名字以及 jar 的版本号。
     展示包数据可以很好的解决 jar 版本冲突的问题。但是,这个的代价比较高,特别是在频繁报错的情况下。
-->
<!-- debug="true": 当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。-->
<configuration scan="true" scanPeriod="30 seconds" packagingData="true" debug="true">
<!--    预定义的属性(算是定义常量)-->
    <property scope="context" name="log_path" value="../logs" />
    <property scope="context" name="context_name" value="logback-test" />
    <!-- 彩色日志 -->
    <!-- 彩色日志依赖的渲染类 -->
<!--    自定义转换器 - 可是实现客制化需求 -->
    <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" />
    <!-- 彩色日志格式 -->
    <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(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>

<!--    Appender 最基本的责任是将日志事件进行输出。
        然而,它们可以委托 Layout 或者 Encoder 对象来对日志事件进行格式化。
        每一个 layout/encoder 有且只与一个 appender 相关联。-->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!--        ConsoleAppender 就跟名字显示的一样,是将日志事件附加到控制台,跟进一步说就是通过 System.out 或者 System.err 来进行输出。默认通过前者。
            ConsoleAppender 通过用户指定的 encoder,格式化日志事件。
            System.out 与 System.err 两者都是 java.io.PrintStream 类型。
            因此,它们被包装在可以进行 I/O 缓存操作的 OutputStreamWriter 中。-->
        <target>System.out</target>
<!--        System.out 或 System.err。默认为 System.out -->

<!--        encoder 负责将日志事件转换为字节数组,
            并将字节数组写入到合适的 OutputStream 中。
            所以,encoder 可以完全控制将什么样的字节以及什么时候将字节写入到由 appender 维护的 OutputStream 中。-->
        <encoder>
<!--            日志输出格式-->
            <pattern>| [%-5level] [%date{ISO8601}] [%logger] [%thread] [%X{akkaSource}] - %msg %rootException %n</pattern>
<!--            设置日志编码-->
            <charset>UTF-8</charset>
        </encoder>
    </appender>

<!--    RollingFileAppender 继承自FileAppender,
        具有轮转日志文件的功能。
        例如,RollingFileAppender 将日志输出到 log.txt 文件,在满足了特定的条件之后,将日志输出到另外一个文件。-->
    <appender name="rollingFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log_path}/${context_name}/${context_name}.log</file>
<!--        TimeBasedRollingPolicy 是最常用的轮转策略。
            它是基于时间来定义轮转策略。例如按天或者按月。TimeBasedRollingPolicy 既负责轮转的行为,也负责触发轮转。 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--            TimeBasedRollingPolicy 支持文件自动压缩。如果 fileNamePattern 以 .gz 或者 .zip 结尾,将会启动这个特性。 -->

<!--        fileNamePattern 该属性定义了轮转时的属性名。
            它的值应该由文件名加上一个 %d 的占位符。%d 应该包含 java.text.SimpleDateFormat 中规定的日期格式。
            如果省略掉这个日期格式,那么就默认为 yyyy-MM-dd。轮转周期是通过 fileNamePattern 推断出来的。-->
            <fileNamePattern>${log_path}/${context_name}_%d{yyyy-MM-dd}.zip</fileNamePattern>
<!--            maxHistory 这个可选的属性用来控制最多保留多少数量的归档文件,将会异步删除旧的文件。
                比如,你指定按月轮转,指定 maxHistory = 6,那么 6 个月内的归档文件将会保留在文件夹内,大于 6 个月的将会被删除。
                注意:当旧的归档文件被移除时,当初用来保存这些日志归档文件的文件夹也会在适当的时候被移除。-->
            <maxHistory>1</maxHistory>
        </rollingPolicy>
        <encoder>
            <!--            日志输出格式-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger{36} -%method - [%X{logback}] - %msg%n</pattern>
<!--            设置日志编码-->
            <charset>UTF-8</charset>
        </encoder>
    </appender>
<!-- 日志输出级别-->
    <root level="INFO">
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="rollingFile"/>
    </root>

</configuration>

创建Logger对象

private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(HomeController.class);

Lombok

Lombok项目是一个Java库,它会自动插入编辑器和构建工具中,Lombok提供了一组有用的注释,用来消除Java类中的大量样板代码。使用一个注解可以替换数百行代码从而产生干净,简洁且易于维护的Java类。
Lombok也存在一定风险,在一些开发工具商店中没有Project Lombok支持选择。 IDE和JDK升级存在破裂的风险,并且围绕项目的目标和实施存在争议。

环境准备

了解Lombok常用注解
IntelliJ IDEA 2019.1.3
安装Lombok插件并启用设置

常用注解

@Setter :注解在类或字段,注解在类时为所有字段生成setter方法,注解在字段上时只为该字段生成setter方法。

@Getter :使用方法同上,区别在于生成的是getter方法。

@ToString :注解在类,添加toString方法。

@EqualsAndHashCode: 注解在类,生成hashCode和equals方法。

@NoArgsConstructor: 注解在类,生成无参的构造方法。

@RequiredArgsConstructor: 注解在类,为类中需要特殊处理的字段生成构造方法,比如final和被@NonNull注解的字段。

@AllArgsConstructor: 注解在类,生成包含类中所有字段的构造方法。

@Data: 注解在类,生成setter/getter、equals、canEqual、hashCode、toString方法,如为final属性,则不会为该属性生成setter方法。

@Slf4j: 注解在类,生成log变量,严格意义来说是常量。

安装IDE插件

在这里插入图片描述

引入依赖

    // https://mvnrepository.com/artifact/org.projectlombok/lombok
    compile group: 'org.projectlombok', name: 'lombok', version: '1.18.10'

调整设置

在这里插入图片描述
在这里插入图片描述

码代码

@Slf4j
@Controller
public class HomeController {
//    private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(HomeController.class);
    @ResponseBody
    @RequestMapping("/test")
    public String testProc(){
        for (int i = 0; i < 10000000; i++) {
        log.info("2019年10月20日21:03:25 : Logback");
        }
        return "success";
    }
发布了48 篇原创文章 · 获赞 8 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/wangxudongx/article/details/102654234