在Java中,日志是一种记录和追踪应用程序运行时信息的重要工具.以下是日志在Java中的几个主要用途:
Java中有多种日志框架可供选择,如Log4j
、Logback
和java.util.logging
等。这些日志框架提供了丰富的功能和配置选项,可以根据需求灵活地记录日志,并支持将日志输出到不同的目标(如控制台、文件、数据库等)。
在Spring Boot
中,可以通过使用日志框架来记录应用程序的日志。Spring Boot默认使用的是SLF4J
(Simple Logging Facade for Java),并且集成了常用的日志实现框架,如Logback
和Log4j2
。
程序员自定义打印日志的实现步骤:
pom.xml
中添加以下依赖: <dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-loggingartifactId>
dependency>
application.properties
或application.yml
中配置日志级别。可以设置根级别日志以及特定类或包的日志级别。例如,要将根级别日志设置为info级别,可以在配置文件中添加以下配置:package com.example.demo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class MyController {
private static final Logger logger = LoggerFactory.getLogger(MyController.class);//步骤一
@RequestMapping("/hello")
public String home() {
logger.info("Hello, info!");//步骤二
return "Welcome to my application!";
}
}
注意此处导入的包是import org.slf4j.Logger;
关于Logger的包有很多,注意不要导错了.
在网页中访问:http://localhost:8888/hello
结果如下:
同时再控制台中我们可以看到以下日志信息:
注意:Spring Boot
还提供了一些特殊的日志记录器,如logging.file
和logging.path
等,用于指定日志文件的位置和名称。此外,还可以使用logging.pattern.console
和logging.pattern.file
等属性来自定义控制台和文件日志的输出格式。
下来我们试一下不同日志级别的打印以及日志各部分详情介绍:
那么就有小伙伴疑惑,为什么`logger.trace(“Hello, trace!”); logger.debug(“Hello,debug!”);``这两行没有打印呢?这与日志的级别有关:
日志级别用于控制日志输出的详细程度,可以根据需求选择合适的级别来记录和查看日志信息。通过设置适当的日志级别,可以灵活地控制日志的输出量和详细程度。在开发和调试阶段可以使用较低的日志级别(如DEBUG),以获得更多的信息帮助排查问题。而在生产环境中,可以将日志级别设置为较高的级别(如INFO或WARN),以减少日志输出并降低对性能的影响。
此外,日志级别还可以根据具体的应用程序需求进行扩展和自定义。例如,可以定义自己的日志级别来表示特定的业务场景或关键事件。
⽇志的级别分为:
TRACE
(追踪):最详细的日志级别,通常用于跟踪代码执行路径、变量状态等详细信息。在生产环境中很少使用,因为它会产生大量的日志输出。
DEBUG
(调试):用于开发和调试阶段,输出较为详细的日志信息,有助于理解代码的执行过程和检测问题。在生产环境中一般不建议使用,因为它会产生大量的日志输出。
INFO
(信息):用于输出重要的业务信息,如应用程序启动信息、关键操作完成信息等。通常会记录应用程序运行中的重要事件,可以用于监控和分析。
WARN
(警告):表示潜在的错误情况,可能会导致应用程序出现异常或不正常的行为,但不会造成严重的系统故障。例如,某些配置项未设置、数据库连接超时等。需要引起注意,但不会影响应用程序的正常运行。
ERROR
(错误):表示发生了可恢复的错误,导致应用程序无法正常执行某些功能或服务。例如,数据库连接失败、请求处理异常等。需要开发人员关注并及时处理。
FATAL
(致命):表示发生了无法恢复的严重错误,这通常会导致应用程序崩溃或无法继续执行。例如,关键依赖项启动失败、文件系统不可用等。
级别越高,接收到的消息就越少,如设置了 warn 就只能收到 warn、error、fatal 级别的日志了。
日志级别配置只需要在配置文件中设置“logging.level
”配置项即可,如下所示:
此时就只打印error级别及以上的日志了:
默认日志输出级别
清除掉配置⽂件中的日志设置,观察控制台输⼊的日志级别。
得到以下结论,日志的输出级别,默认是 info
上述日志都是输出在控制台上的,然而在生产环境上我们需要将日志保存下来,以便出现问题之后追溯问题,把日志保存下来的过程就叫做持久化.以下是在Spring Boot中进行日志持久化的步骤:
pom.xml
文件中添加日志框架的依赖。可以通过Spring Boot Starter依赖简化配置的过程,例如对于Logback,可以添加spring-boot-starter-logging
依赖。 <dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-loggingartifactId>
dependency>
application.properties
或application.yml
中进行相应的配置。具体配置方式取决于所选择的日志框架。logging:
file:
# 设置日志文件的目录
path: E:\\JavaEE\\logger
# 设置日志文件的名字
name: E:\\JavaEE\\logger\\SpringBootDemoLog.log
我们可以在E:\\JavaEE\\logger
目录中看到以下文件:
可以看到文件中记录了当前运行的日志信息:
每次都使用 LoggerFactory.getLogger(xxx.class)
很繁琐,且每个类都添加⼀遍,也很麻烦,这里讲⼀
种更好⽤的日志输出方式,使用 lombok 来更简单的输出。
添加Lombok依赖:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
package com.example.demo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/p")
@Slf4j
public class PersonController {
@RequestMapping("/log")
public void loggerTest() {
log.error("------------------- error -----------------");
}
}
lombok 能够打印⽇志的密码就在 target ⽬录⾥⾯,target 为项⽬最终执⾏的代码,查看 target ⽬录如下:
Java程序运行原理:
Lombok的作用如下图所示:
Lombok的运行原理是通过注解处理器在编译时对源代码进行解析和转换,生成对应的代码片段,并将其插入到编译过程中的抽象语法树中,从而简化Java类的编写。这样可以减少开发者编写重复、繁琐的代码,提高开发效率。
基本注解:
注解 | 作⽤ |
---|---|
@Getter | ⾃动添加 getter ⽅法 |
@Setter | ⾃动添加 setter ⽅法 |
@ToString | ⾃动添加 toString ⽅法 |
@EqualsAndHashCode | ⾃动添加 equals 和 hashCode ⽅法 |
@NoArgsConstructor | ⾃动添加⽆参构造⽅法 |
@AllArgsConstructor | ⾃动添加全属性构造⽅法,顺序按照属性的定义顺序 |
@NonNull | 属性不能为 null |
@RequiredArgsConstructor | ⾃动添加必需属性的构造⽅法,final + @NonNull 的属性为必需 |
组合注解:
注解 | 作⽤ |
---|---|
@Data | @Getter + @Setter + @ToString +@EqualsAndHashCode +@RequiredArgsConstructor +@NoArgsConstructor |
@Slf4j | 添加⼀个名为 log 的⽇志,使⽤ slf4j |