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。
配置文件加载顺序
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";
}