什么是日志
日志是一种记录系统运行时信息的方式,这些信息可以包括程序的状态、错误消息、警告、调试信息等
日志的作用
1. 调试和故障排除
当代码出现Bug时,可以通过查看日志,了解程序正在执行过程中的各个步骤和状态,可快速定位和修复问题。
2. 监控和性能分析
用于监控应用程序的运行状况和性能。可以记录关键指标,如响应时间、内存使用情况、数据库查询次数等,通过这些日志数据分析,可以及时发现潜在的性能问题,并采取措施来改进应用程序的性能
3. 了解用户行为
如果应用程序需要收集用户数据,可以记录用户的行为、偏好和操作,以便更好地了解他们的需求,改进用户体验,并做出针对性的改进。
4. 安全性
通过记录安全事件和潜在的风险,可以更好的保护应用程序和用户数据。
日志级别
TRACE(跟踪日志)
最低级别的日志记录,用于输出最详细的调试信息,通常用于开发调试目的。在生产环境中,应该关闭TRACE级别的日志记录,以避免输出过多无用信息。
DEBUG(调试日志)
用于输出程序中的一些调试信息,通常用于开发过程中。像trace一样,在生产环境中应该关闭DEBUG级别的日志记录。
INFO(信息日志)
用于输出程序正常运行时的一些关键信息,比如程序的启动、运行日志等。通常在生产环境中开启INFO级别的日志记录。
WARN(警告日志)
用于输出一些警告信息,提示程序可能出现一些异常或错误。在应用程序中,WARN级别的日志记录通常用于记录一些非致命的异常信息,以便能够及时发现并处理这些问题。
ERROR(错误日志)
用于输出程序运行时的一些错误信息,通常表示程序出现了一些不可预料的错误。在应用程序中,ERROR级别通常用于记录一些致命性异常信息,以便能够及时发现并处理。
FATAL(致命日志)
最高级别的日志记录,表示程序出现致命错误或异常,即不可恢复的错误。
如何写日志
选择恰当的日志级别
打印有用的信息
注意日志格式
避免泄露敏感信息(如密码、API密钥或个人数据)
使用System.out.println打印日志的不足之处
- 大量的IO操作,对系统性能产生比较大的消耗。
- 它是一个同步操作,打印日志时会阻碍系统正常的业务处理。
- 控制台输出,无法保存日志,不方便运维事后排查问题。
- 无法控制输出。(没有日志打印开关)
常见的日志框架
Log4j
Log4j是最早流行的日志框架之一。它由Ceki Gülcü开发,并后来由Apache软件基金会接
管。Log4j 提供了灵活的配置选项、多种输出目的地、日志级别和分层日志体系。尽管Log4j 1在其时代
取得了巨大的成功,但在性能和某些功能方面存在限制,因此后来演化为Log4j2
LogBack
Logback 是Ceki Gülcü开发的日志框架,他也是Log4j的作者。Logback 是Log4j 的后续版本,旨在提供更高性能、更灵活的配置和现代化的日志解决方案。Logback 支持异步日志记录、多种输出格式、灵活的配置以及与SLF4J紧密集成
SLF4J
严格来说,SLF4J 并不算一个框架,而是Ceki Gülcü开发的一个日志门面接口。它为Java应用程序提供了统一的日志抽象,使开发人员可以使用一致的API进行日志记录,而不需要直接依赖于特定的日志实现。SLF4J 可以与多种底层日志框架(如Logback、Log4j2、java.util.logging等)结合使用。使用 SLF4J 应用程序就可以在不同的日志框架之间进行灵活配置和切换,同时还可以获得更好的性能表现
SLF4J使用:
<!-- slf4j 依赖包--> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.36</version> </dependency>
Log4j2(Log4j2与LogBack:从性能方面 Log4j2 与 Logback 表现都很优秀,但 Log4j2 晚出来几年,有后发优势,性能会比 Logback 更好)
Log4j2 是 Apache 软件基金会开发的 Log4j 的下一代版本。它引入了许多新特性,如异步日志记录、插件支持、丰富的过滤器等,旨在提供更好的性能和灵活性。Log4j2 在设计上考虑了 Log4j 的局限性,并且支持多种配置方式
日志框架三大组件
记录器(Loggers)
按照布局中指定的格式把日志信息写入一个或多个输出源
输出源(Appenders)
日志输出可以是控制台、文本文件、XML文件或Socket 等
布局(Logouts)
所有集成Layout类的类定义了日志信息的布局,所谓布局就是日志信息的格式
LogBack在SpringBoot中的运用:
导入依赖:
<dependencies>
<!-- slf4j 依赖包-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.36</version>
</dependency>
<!-- lombok 依赖包-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.12</version>
</dependency>
</dependencies>
在工程的resources目录下创建logback.xml配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false" scan="true" scanPeriod="1 seconds">
<contextName>logback</contextName>
<!-- 定义日志变量-->
<property name="log.path" value="logs.log/" />
<!--日志输出到控制台-->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>DEBUG</level>
</filter>
<encoder>
<pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level
%logger{36} - %msg%n
</pattern>
</encoder>
</appender>
<!-- 日志输出到文件 -->
<appender name="file"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}</file>
<rollingPolicy
class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}.%d{yyyy-MM-dd}.zip</fileNamePattern>
</rollingPolicy>
<encoder>
<pattern>%date %level [%thread] %logger{36} [%file : %line] %msg%n
</pattern>
</encoder>
</appender>
<!-- 根日志输出级别-->
<root level="debug">
<appender-ref ref="console" />
<appender-ref ref="file" />
</root>
<!-- 指定包日志输出级别-->
<logger name="com.binge" level="debug" />
</configuration>
创建文件的打印日志方式一(不推荐)
package com.hpc;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class LogDemo {
//获取日志记录器对象
private static final Logger log = LoggerFactory.getLogger(LogDemo.class);
public static void main(String[] args) {
log.info("这是一条日志信息");
}
}
创建文件的打印日志方式二(推荐使用)---使用注解
package com.hpc;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class LogDemo2 {
public static void main(String[] args) {
log.info("这是一条日志信息");
}
}
标签:输出,框架,记录,Logback,日志,Log4j2,Log4j
From: https://www.cnblogs.com/hpc02/p/17837421.html