Lombok(发音为"lombók")是一种Java库,它通过注解的方式来简化Java代码的编写。它提供了一组注解,用于在编译时生成代码,减少了开发人员需要手动编写的样板代码,提高了代码的简洁性和可读性。
Lombok 主要用于减少Java代码中的冗余,例如,通过添加 @Getter
和 @Setter
注解,可以自动生成类的 getter 和 setter 方法,而无需手动编写这些方法。除此之外,Lombok 还提供了其他注解,如 @ToString
、@EqualsAndHashCode
、@NoArgsConstructor
等,用于生成相应的代码。
使用 Lombok 可以让开发人员更专注于业务逻辑的实现,而不必过多地关注类的样板代码。它在许多Java项目中得到广泛应用,特别是在Spring等框架中。
依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
常用注解
@Getter
:为属性生成 getter 方法。@Setter
:为属性生成 setter 方法。@ToString
:生成toString()
方法。@EqualsAndHashCode
:生成equals()
和hashCode()
方法。@NoArgsConstructor
:生成无参构造方法。@AllArgsConstructor
:生成全参构造方法。@Data
:结合@Getter
、@Setter
、@ToString
、@EqualsAndHashCode
和@NoArgsConstructor
的组合注解。@Builder
:为类提供一个 builder 模式。@Slf4j
:为类提供一个 SLF4J 日志对象。@NonNull
:在参数上使用,生成一个非空检查。@Cleanup
:在局部变量上使用,自动关闭资源。
日志
@Slf4j
是 Lombok 中的一个注解,它会自动生成一个名为 log
的日志对象,用于在程序中输出日志信息。
具体来说,@Slf4j
注解可以用于任何类上,包括普通类、接口、枚举等,它会在编译时自动生成一个名为 log
的日志对象,用于在程序中输出日志信息。使用 @Slf4j
注解,您可以通过以下方式使用日志对象:
log.debug("Debug log message");
log.info("Info log message");
log.warn("Warning log message");
log.error("Error log message");
在上述代码中,log
对象是通过 @Slf4j
注解自动生成的,您可以使用它来输出日志信息。在运行时,Lombok 会生成一个包含 log
对象的静态字段,其类型是根据类名自动生成的。
需要注意的是,使用 @Slf4j
注解前,需要在项目中引入 Lombok 的依赖。
@Slf4j
public class LogExample {
}
will generate:
public class LogExample {
private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LogExample.class);
}
配置文件
appender
追加器,指定日志如何输出
<!-- 系统日志输出info级别 -->
<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/sys-info.log</file>
<!-- 循环政策:基于时间创建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件名格式 -->
<fileNamePattern>${log.path}/sys-info.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史 60天 -->
<maxHistory>60</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 过滤的级别 -->
<level>INFO</level>
<!-- 匹配时的操作:接收(记录) -->
<onMatch>ACCEPT</onMatch>
<!-- 不匹配时的操作:拒绝(不记录) -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
name随便写,class指定日志输出到哪里:RollingFileAppender日志输出到文件并滚动,滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件,这个是最常用的;ConsoleAppender日志输出到控制台
<file>说明输出的文件位置和文件名
<rollingPolicy>滚动策略
<root>
根日志(Root Logger)是日志系统的最顶层的日志记录器。它是整个日志系统的入口,所有的日志事件都会首先传递给根日志,然后根据配置的日志级别和附加器(Appender)的设置进行相应的处理。
<logger>
<logger>
标签用于配置特定包或类的日志级别和附加器。在Logback中,每个 <logger>
元素允许你配置日志系统中的特定组件的日志行为。
<logger name="com.example.MyClass" level="DEBUG">
<appender-ref ref="file" />
</logger>
name指定com.example.MyClass这个类的日志级别为debug,日志级别大于等于debug的都用file这个appender处理。
这个配置的含义是:
name
属性指定了要配置的包或类的名称(例如com.example.MyClass
)。level
属性指定了这个包或类的日志级别(例如DEBUG
)。<appender-ref>
元素允许你指定用于处理这个包或类日志事件的附加器(Appender)。
这样,可以对系统的不同部分配置不同的日志级别和输出方式,使得日志系统更加灵活和可控。
总配置
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 引入spirng boot默认的logback配置文件 -->
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
<!-- 日志存放路径 -->
<property name="log.path" value="./logs" />
<!-- 日志输出格式 -->
<property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />
<!-- 控制台输出 -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<!-- <pattern>${log.pattern}</pattern>-->
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
</encoder>
</appender>
<!-- 系统日志输出info级别 -->
<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/sys-info.log</file>
<!-- 循环政策:基于时间创建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件名格式 -->
<fileNamePattern>${log.path}/sys-info.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史 60天 -->
<maxHistory>60</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 过滤的级别 -->
<level>INFO</level>
<!-- 匹配时的操作:接收(记录) -->
<onMatch>ACCEPT</onMatch>
<!-- 不匹配时的操作:拒绝(不记录) -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 系统日志输出error级别 -->
<appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/sys-error.log</file>
<!-- 循环政策:基于时间创建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件名格式 -->
<fileNamePattern>${log.path}/sys-error.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史 60天 -->
<maxHistory>60</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 过滤的级别 -->
<level>ERROR</level>
<!-- 匹配时的操作:接收(记录) -->
<onMatch>ACCEPT</onMatch>
<!-- 不匹配时的操作:拒绝(不记录) -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 用户访问日志输出 -->
<appender name="sys-user" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/sys-user.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 按天回滚 daily -->
<fileNamePattern>${log.path}/sys-user.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史 60天 -->
<maxHistory>60</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
</appender>
<!-- 系统模块日志级别控制 -->
<logger name="com.lin" level="info" />
<!-- Spring日志级别控制 -->
<logger name="org.springframework" level="warn" />
<!--系统大于等于info级别的日志输出到控制台-->
<root level="info">
<appender-ref ref="console" />
</root>
<!--系统大于等于info级别的日志:如果是info使用file_info处理,如果是error使用file_error处理-->
<root level="info">
<appender-ref ref="file_info" />
<appender-ref ref="file_error" />
</root>
<!--sys-user类或包下的info级别日志使用sys-user处理-->
<logger name="sys-user" level="info">
<appender-ref ref="sys-user"/>
</logger>
</configuration>